web-dev-qa-db-fra.com

SQL Server SELECT INTO @variable?

J'ai le code suivant dans un de mes SQL (2008) Stored Procs qui s'exécute parfaitement 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

Alors la question pour vous est la suivante: est-il possible de faire quelque chose comme:

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

Pour que je puisse réutiliser ces données de la mémoire dans d'autres instructions suivantes? SQL Server convient parfaitement à l’instruction ci-dessus, mais je ne souhaite pas avoir à créer des variables distinctes et à initialiser chacune d’elles via une instruction SELECT distincte contre la même table .... UGH !!!

Des suggestions sur la façon de réaliser quelque chose le long des lignes sans plusieurs requêtes sur la même table?

229
bleepzter

Vous ne pouvez pas sélectionner .. dans .. une table variable. Le mieux que vous puissiez faire est de le créer d'abord, puis de l'insérer. Votre deuxième extrait doit être

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
194
RichardTheKiwi

Si vous voulez simplement assigner des variables pour une utilisation ultérieure, vous pouvez les faire en une seule fois avec quelque chose dans le genre:

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

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

Si c'est le genre de chose que vous recherchez

468
dougajmcdonald

tu peux le faire:

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

puis plus tard

SELECT CustomerId FROM #tempCustomer

vous n'avez pas besoin de déclarer la structure de #tempCustomer

Il semble que votre syntaxe soit légèrement incorrecte. Cela a quelques bons exemples

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

Puis plus tard

SELECT CustomerId FROM @TempCustomer
14
Pat L

On dirait que vous voulez des tables temporaires. http://www.sqlteam.com/article/temporary-tables

Notez que #TempTable est disponible dans tout votre SP.

Notez que la ## TempTable est disponible pour tous.

2
Valamas

J'ai trouvé votre question à la recherche d'une solution au même problème; et quelles autres réponses ne parviennent pas à pointer est un moyen d’utiliser une variable pour changer le nom de la table à chaque exécution de votre procédure sous une forme permanente, et non temporaire.

Jusqu'ici, je concatène l'intégralité du code SQL avec les variables à utiliser. Comme ça:

declare @table_name as varchar(30)
select @table_name = CONVERT(varchar(30), getdate(), 112)
set @table_name = 'DAILY_SNAPSHOT_' + @table_name

EXEC('
        SELECT var1, var2, var3
        INTO '+@table_name+'
        FROM my_view
        WHERE string = ''Strings must use double apostrophe''
    ');

J'espère que cela vous aidera, mais si le code est trop volumineux, cela risque d'être fastidieux. Si vous avez trouvé un meilleur moyen, partagez-le!

1
Rodrigo