SQL Server SELECCIONAR EN @variable?


Tengo el siguiente código en uno de mis Procs almacenados Sql (2008) que se ejecuta perfectamente bien:

    CREATE PROCEDURE [dbo].[Item_AddItem]
        @CustomerId uniqueidentifier,
        @Description nvarchar(100),
        @Type int,
        @Username nvarchar(100),
    AS
    BEGIN

        DECLARE @TopRelatedItemId uniqueidentifier;
        SET @TopRelatedItemId = 
        (
           SELECT top(1) RelatedItemId 
           FROM RelatedItems 
           WHERE CustomerId = @CustomerId
        ) 

        DECLARE @TempItem TABLE
        (
            ItemId uniqueidentifier,
            CustomerId uniqueidentifier,
            Description nvarchar(100),
            Type int,
            Username nvarchar(100),
            TimeStamp datetime
        );

        INSERT INTO Item
        OUTPUT INSERTED.* INTO @TempItem
        SELECT NEWID(), @CustomerId, @Description, @Type, @Username, GETDATE()

        SELECT
            ItemId,
            CustomerId,
            @TopRelatedItemId,
            Description,
            Type,
            Username,
            TimeStamp
        FROM
            @TempItem
END
GO

Así que la pregunta para ustedes es si hay una posibilidad de hacer algo como:

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
INTO 
    @TempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

Para que pueda reutilizar estos datos de la memoria en otras declaraciones siguientes? SQL Server lanza un ajuste con la instrucción anterior, sin embargo, no quiero tener que crear variables separadas e inicializar cada una de ellas a través de una instrucción SELECT separada contra la la misma mesa.... UGH!!!

¿Alguna sugerencia sobre cómo lograr algo por el estilo sin múltiples consultas en la misma tabla?

Author: RichardTheKiwi, 2011-01-28

6 answers

No se puede SELECCIONAR .. EN .. una VARIABLE DE TABLA. Lo mejor que puedes hacer es crearlo primero, luego insertarlo en él. Su 2do fragmento tiene que ser

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
INSERT INTO 
    @TempCustomer 
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId
 178
Author: RichardTheKiwi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-28 01:34:11

Si simplemente desea asignar algunas variables para su uso posterior, puede hacerlas de una sola vez con algo en esta línea:

declare @var1 int,@var2 int,@var3 int;

select 
    @var1 = field1,
    @var2 = field2,
    @var3 = field3
from
    table
where
    condition

Si ese es el tipo de cosa que buscas

 422
Author: dougajmcdonald,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-30 16:35:25

Puedes hacer esto:

SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email
INTO #tempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

Luego

SELECT CustomerId FROM #tempCustomer

No es necesario declarar la estructura de # tempCustomer

 22
Author: Victor Ribeiro da Silva Eloy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-30 00:45:04

Parece que su sintaxis está ligeramente fuera. Esto tiene algunos buenos ejemplos

DECLARE @TempCustomer TABLE
(
   CustomerId uniqueidentifier,
   FirstName nvarchar(100),
   LastName nvarchar(100),
   Email nvarchar(100)
);
INSERT @TempCustomer 
SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId

Luego

SELECT CustomerId FROM @TempCustomer
 14
Author: Pat L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-28 01:34:29

Parece que quieres tablas temporales. http://www.sqlteam.com/article/temporary-tables

Tenga en cuenta que #TempTable está disponible a través de su SP.

Tenga en cuenta que el ##Tentable está disponible para todos.

 2
Author: Valamas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-28 01:35:09
"SELECT *
  INTO 
    @TempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId"

Lo que significa crear una nueva tabla variable @tempCustomer e insertar datos DEL Cliente. Ya lo había declarado anteriormente, así que no es necesario volver a declararlo. Mejor ir con

INSERT INTO @tempCustomer SELECT * FROM Customer
 -1
Author: koushik veldanda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-08 07:07:23