2010-04-12 24 views
10

tengo una consulta, como a continuaciónSQL tema de la identidad del servidor

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

select @str_CustomerID= scope_identity() 

Después de la ejecución se devuelve un valor nulo en mi parámetro.

Quiero obtener el valor de la identidad. ¿Cómo puedo hacer eso?

El problema principal aquí es "IMDECONP38" - el nombre del servidor que utilicé. Si elimino esto, puedo obtener el valor de identidad en mi parámetro.

+1

¿Qué quiere decir "parámetro " ¿en este contexto? – gbn

+0

@str_CustomerID –

+4

En realidad, hay una columna de identidad en la tabla, ¿verdad? Pregunta tonta, pero por las dudas. . . – MJB

Respuesta

5

Cuando se utiliza "IMDECONP38", entonces se rompe SCOPE_IDENTITY porque alcance

  • el inserto está ahora en el servidor IMDECONP38 ligado
  • SCOPE_IDENTITY se ejecuta en el servidor local, no IMDECONP38

Si en SQL Server 2005, pruebe la cláusula OUTPUT, pero no estoy seguro de cómo funciona para una llamada al servidor vinculado

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

Editar: Prutswonder dijo primero: utilizar un procedimiento almacenado en el servidor vinculado

+0

Error de servidor Sql: No se permite que las tablas remotas sean el destino de una instrucción DML con una cláusula OUTPUT o el objetivo de la cláusula INTO. –

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

usando '@@ IDENTIDAD' es peligroso porque devuelve la última ID generada desde cualquier ámbito. – James

+4

Lordy. Nunca use @@ IDENTITY – gbn

+4

me he dado cuenta del error de mis maneras. no más votos abajo! –

-2

favor, compruebe si hay algún desencadena conjunto para su mesa. Esto causará un problema cuando use SCOPE_IDENTITY() para obtener el último campo de identidad insertado.

HTH

+0

SET NOCOUNT ON no afecta a SCOPE_IDENTITY. O tiene una referencia de MSDN para respaldar esto. Como mi pregunta señala, solo los DataAdaptors pueden verse afectados por SET NOCOUNT ON aquí http://stackoverflow.com/questions/1483732/set-nocount-on-usage – gbn

+0

@gbn: tuve este mismo problema y SET NoCount OFF hizo el truco para mi.De todos modos lo he quitado de mi respuesta :-). – Raja

+1

Los desencadenantes afectan el valor de @@ Identity not scope_identity() – HLGEM

9

Ver this old question para un problema similar: No se puede recuperar una variable con ámbito como SCOPE_IDENTITY() de otro servidor. En su lugar, debe usar un procedimiento almacenado en el servidor remoto para lograr esto.

+0

Buena llamada. El mejor consejo hasta ahora. – gbn

2

Utilice un procedimiento almacenado en la base de datos remota.

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

Para SQL Server 2012, para obtener el nombre de la columna de identidad

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

Si tiene un servidor vinculado puede utilizar esto:

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' 
Cuestiones relacionadas