Cómo almacenar múltiples valores en variables TSQL

Tengo la siguiente statement de TSQL:

SELECT ProductId, OwnerId FROM Product 

¿Cómo puedo almacenar ProductId y OwnerId en una variable TSQL y luego devolverlo a la aplicación de llamada?

Este tipo de cosas normalmente se realiza ejecutando la consulta y evaluando los resultados en la aplicación usando el marco apropiado (por ejemplo, en .NET usaría una de las muchas herramientas ORM, los objects ADO.NET como DataTable , o un DbDataReader ), en lugar de devolverlos como una variable. Por un lado, devolver los valores como una variable significará que solo obtendrá los valores de una fila, independientemente de cuántos hay en su set de resultados.

Si esto es realmente lo que quieres (y necesitas) hacer, entonces tendrás que encontrar la forma de combinarlos en un solo valor. Por lo general, funciona algo así como usar una barra vertical ( | ) y separar los valores de la cadena y luego dividirla en el lado del cliente.

En general, no, no puede almacenar valores múltiples en una variable sin algunos saltos de círculo como lists delimitadas. En su ejemplo, presumiendo que la tabla Product tiene una sola fila, puede hacer algo como:

 Declare @ProductId <datatype> Declare @OwnerId <datatype> Select @ProductId = ProductId , @OwnerId = OwnerId From Product 

Si la tabla Product tiene más de una fila, esto no funcionará y lo que debe hacer a continuación depende en gran medida de lo que realmente está tratando de lograr.

No puede almacenarlo en una sola variable; una variable puede contener un valor.

Pero puede almacenarlo fácilmente en una tabla en memory, algo así como:

 CREATE TABLE @Temporary(ProductID INT, OwnerID INT) INSERT INTO @Temporary(ProductID INT, OwnerID INT) SELECT ProductId, OwnerId FROM dbo.Product 

Con esto, ahora tiene una tabla en la memory, que puede usar como cualquier otra tabla: select de ella, únala a tablas en el disco, lo que sea que necesite hacer. Puede devolver esto a una aplicación de llamada como resultado, como cualquier otro resultado de consulta.

Si está absolutamente configurado para cargar esos valores en una variable:

 DECLARE @foo varchar(256) SET ROWCOUNT 1; SELECT @foo = CAST(ProductId AS varchar(100)) + '|' + CAST(OwnerId AS varchar(100) FROM Product WHERE ProductName = 'foo'