Vielleicht ist mein Problem für diese Community einfach, aber für mich (einen einfachen Java-Programmierer) ist es ein großes Problem.
Ich habe eine große Datenbank mit immer mehr Daten. Der externe Datenbankadministrator hatte also einen Job erstellt, der mir in einer temporären Tabelle die Daten anzeigt, die ich benötige. Aber er hatte die Tabelle ohne Primärschlüssel erstellt und wenn ich mit meinem Java-Projekt diese Tabelle lese, erhalte ich eine Fehlermeldung.
Ich kann diese Tabelle nicht lesen, da der Primärschlüssel nicht vorhanden ist.
Kann ich in die Prozedur die Möglichkeit einfügen, einen automatisch inkrementellen Primärschlüssel zu erstellen, ohne die Struktur dieser komplexen Prozedur zu ändern?
Dies ist der Beginn des Codes für gespeicherte Prozeduren:
USE [MYDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER Procedure [dbo].[spSchedula_Scadenzario]
as
begin
drop table MYDB.dbo.tmpTable
select
aa.*
into MYDB.dbo.tmpTable
from (...)
Danke im Voraus
Einige Alternativen zum Hinzufügen der Auto-Inkrement-Spalte über die
IDENTITY()
von @Shaneis vorgeschlagene Funktion sind:Erstellen Sie die Tabelle explizit mit
CREATE TABLE
anstatt mitSELECT INTO
. Ich bevorzuge diese Methode sehr, da Sie damit die vollständige Kontrolle über die zu erstellende Tabelle haben, z. B. die Spalte für die automatische Inkrementierung einschließen und angeben, dass es sich um den Primärschlüssel handelt. Zum Beispiel:Wenn Sie nicht ändern können, wie / wann / wo die Tabelle erstellt wird, können Sie später jederzeit eine Spalte hinzufügen. Dabei können Sie sowohl angeben, dass es sich um eine
IDENTITY
Spalte handelt, als auch den Primärschlüssel erstellen . Zum Beispiel:Dies funktioniert sogar, wenn die Tabelle bereits Daten enthält: Die neue
IDENTITY
Spalte wird wie erwartet ausgefüllt, beginnend mit dem für denseed
Parameter angegebenen Wert . Es gibt jedoch keine Möglichkeit, die Reihenfolge zu steuern, in der die Werte zugewiesen werden (dies ist einer von mehreren Gründen, wenn möglich, Option 1 zu wählen).Zusätzliche Bemerkungen:
Sind Sie sicher, dass Sie einen Primärschlüssel und nicht nur eine automatisch inkrementierende / eindeutige Spalte benötigen? Während es normalerweise eine gute Idee ist, einen Primärschlüssel zu haben, ist er weder erforderlich noch dasselbe wie eine automatisch inkrementierende Spalte. Ich frage nur, weil sowohl der Titel als auch der Text dieser Frage besagen, dass Sie einen Primärschlüssel benötigen, aber Sie sagen in einem Kommentar zu der Antwort, dass Sie akzeptiert haben, dass einfach die Spalte für die automatische Inkrementierung funktioniert.
Die von Ihnen verwendete Tabelle ist eigentlich keine temporäre Tabelle. Echte temporäre Tabellen haben Namen, die mit
#
oder##
für globale temporäre Tabellen beginnen. Die Tabelle, die Sie verwenden,dbo.tmpTable
ist nur eine reguläre, permanente Tabelle, der das Präfix "tmp" vorangestellt ist, um anzuzeigen, dass sie wahrscheinlich nur für diesen Prozess und nicht Teil des Datenmodells ist.Wenn der App-Code nicht auf diese "temporäre" Tabelle zugreifen muss und der einzige Verweis darauf in dieser gespeicherten Prozedur enthalten ist, können Sie ihn in eine echte temporäre Tabelle ändern, die den Vorteil hat, dass sie bereinigt wird, wenn Der Vorgang ist abgeschlossen. In diesem Fall benötigen Sie die
DROP TABLE
Anweisung nicht.Wenn Sie eine permanente Tabelle anstelle einer temporären Tabelle verwenden (in diesem Fall müssen Sie sie selbst bereinigen), sollte die
DROP TABLE
Anweisung an Bedingungen geknüpft sein, damit sie nicht fehlerhaft ist, wenn die Tabelle nicht vorhanden ist:Anstatt dies zu tun
SELECT *
, sollten Sie die vollständige Spaltenliste angeben. Durch*
die Verwendung wird die Wahrscheinlichkeit erhöht, dass der Prozess unterbrochen wird, wenn Sie Tabellen / Unterabfragen Spalten / Felder hinzufügen (für was auchaa
immer ein Alias ist).quelle