Frage SQL Server-Identitätsproblem


Ich habe eine Abfrage wie unten

declare @str_CustomerID int
Insert into IMDECONP38.[Customer].dbo.CustomerMaster
( CustomerName , CustomerAddress , CustomerEmail , CustomerPhone )
values ( ‘werw12e’ , ‘jkj12kj’ , ‘3212423sdf’ , ‘1212121′
)

select @str_CustomerID= scope_identity()

Nach der Ausführung gibt es in meinem Parameter null zurück.

Ich möchte den Wert von Identität erhalten. Wie kann ich das machen?

Das Hauptproblem hier ist "IMDECONP38" - der Servername, den ich verwendet habe. Wenn ich das entferne, kann ich den Wert der Identität in meinem Parameter erhalten.


11
2018-04-12 12:09


Ursprung


Antworten:


Wenn Sie "IMDECONP38" verwenden, dann brechen Sie SCOPE_IDENTITY ab

  • Der INSERT-Bereich befindet sich jetzt auf dem Verbindungsserver IMDECONP38
  • SCOPE_IDENTITY wird auf dem lokalen Server ausgeführt, nicht IMDECONP38

Versuchen Sie auf SQL Server 2005 das AUSGABE Klausel, aber ich bin mir nicht sicher, wie es für einen Verbindungsserver-Anruf funktioniert

Insert into IMDECONP38.[Customer].dbo.CustomerMaster
OUTPUT INSERTED.ID   --change as needed
( CustomerName , CustomerAddress , CustomerEmail , CustomerPhone )
values ( ‘werw12e’ , ‘jkj12kj’ , ‘3212423sdf’ , ‘1212121′
)

Bearbeiten: Prutswonder sagte es zuerst: Verwenden Sie eine gespeicherte Prozedur auf dem Verbindungsserver


5
2018-04-12 12:19



Sehen diese alte Frage für ein ähnliches Problem: Sie können eine Bereichsvariable wie nicht abrufen SCOPE_IDENTITY() von einem anderen Server. Stattdessen sollten Sie eine gespeicherte Prozedur auf dem Remote-Server verwenden, um dies zu erreichen.


9
2018-04-12 12:33



Verwenden Sie eine gespeicherte Prozedur in der entfernten Datenbank.

CREATE PROCEDURE InsertCustomer (@name varchar(100), @address varchar(100), 
    @email varchar(100), @phone varchar(100), @id int OUT)
AS
    INSERT INTO dbo.CustomerMaster 
    (CustomerName , CustomerAddress , CustomerEmail , CustomerPhone ) 
    VALUES (@name, @address, @email, @phone)

    SET @id = SCOPE_IDENTITY()
GO

DECLARE @id int
EXEC IMDECONP38.Customer.dbo.InsertCustomer 'Fred','Bedrock','a@b','5',@id OUT
GO

2
2018-04-14 10:58



Für SQL Server 2012, um den Namen der Identitätsspalte zu erhalten

select col_name(sys.all_objects.object_id, column_id) as id from    sys.identity_columns 
join sys.all_objects on sys.identity_columns.object_id = sys.all_objects.object_id
where sys.all_objects.object_id = object_id('system_files')

Wenn Sie einen Linked Server haben, können Sie folgendes verwenden:

select iden.name as id 
from [LINKED_SERVER_NAME].[DATABASE_NAME].sys.identity_columns as iden
join [LINKED_SERVER_NAME].[DATABASE_NAME].sys.all_objects allobj
    on iden.object_id = allobj.object_id
where allobj.name = 'TABLE NAME HERE'

0
2017-07-26 13:45



select @@IDENTITY AS 'variablename'

-2
2018-04-12 12:13



Bitte überprüfen Sie, ob es welche gibt löst aus Setze dich auf deinen Tisch. Dies wird ein Problem verursachen, wenn Sie verwenden SCOPE_IDENTITY() um das letzte eingefügte Identitätsfeld zu erhalten.

HTH


-2
2018-04-12 12:21