2010-04-12 25 views
10

Ich habe eine Abfrage wie untenSQL Server Identität Problem

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 es in meinem Parameter null zurückgibt.

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

Das Hauptproblem hier ist „IMDECONP38“ - der Name des Servers, die ich verwendet. Wenn ich das entferne, kann ich den Wert der Identität in meinem Parameter erhalten.

+1

was meinst du „Parameter " in diesem Kontext? – gbn

+0

@str_CustomerID –

+4

Es ist tatsächlich eine Identität Spalte in der Tabelle, richtig? Dumme Frage, aber nur für den Fall. . . – MJB

Antwort

5

Wenn Sie "IMDECONP38" Sie brechen dann SCOPE_IDENTITY weil

  • die INSERT Umfang nun auf dem IMDECONP38 verknüpften Server ist
  • SCOPE_IDENTITY auf dem lokalen Server ausgeführt wird, nicht IMDECONP38

Wenn auf SQL Server 2005 versuchen, die OUTPUT Klausel aber ich bin nicht sicher, wie es für einen Verbindungsserver Aufruf arbeitet

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

Edit: Prutswonder es die erste: eine gespeicherte Prozedur auf dem Verbindungsserver sind

+0

SQL Server geben Fehler: Remote-Tabellen werden nicht als das Ziel einer DML-Anweisung mit einer OUTPUT-Klausel, oder das Ziel der Klausel INTO erlaubt. –

-2
select @@IDENTITY AS 'variablename' 
+4

mit '@@ IDENTITY' ist gefährlich, da es die letzte ID zurückgibt, die von einem beliebigen Bereich generiert wurde. – James

+4

Herr. Verwenden Sie niemals @@ IDENTITY – gbn

+4

Ich habe den Fehler meiner Wege erkannt. keine weiteren downvotes! –

-2

Bitte überprüfen Sie, ob Sie jede löst Set für Ihren Tisch. Dies führt zu einem Problem, wenn Sie SCOPE_IDENTITY() verwenden, um das zuletzt eingefügte Identitätsfeld abzurufen.

HTH

+0

SET NOCOUNT ON wirkt sich nicht auf SCOPE_IDENTITY aus. Oder haben Sie eine MSDN-Referenz, um dies zu untermauern. Da meine Frage Notizen können nur DataAdaptors von SET NOCOUNT ON hier http://stackoverflow.com/questions/1483732/set-nocount-on-usage – gbn

+0

@gbn betroffen sein: Ich hatte das gleiche Problem und SET NOCOUNT OFF hat den Trick für mich.Jedenfalls habe ich das aus meiner Antwort genommen :-). – Raja

+1

Auslöser beeinflussen den Wert von @@ Identität nicht scope_identity() – HLGEM

9

Siehe this old question für ein ähnliches Problem: Sie können keine Bereichs-Variablen wie SCOPE_IDENTITY() von einem anderen Server abzurufen. Stattdessen sollten Sie eine gespeicherte Prozedur auf dem Remote-Server verwenden, um dies zu erreichen.

+0

Guter Anruf. Der beste Rat bisher. – gbn

2

eine gespeicherte Prozedur in der entfernten Datenbank verwenden.

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','[email protected]','5',@id OUT 
GO 
0

für SQL Server 2012, den Namen der Identitätsspalte

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') 

zu bekommen Wenn Sie einen Linked Server haben Sie diese verwenden können:

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'