SQL Server wybrać do zmiennej@?

Mam następujący kod w jednym z moich SQL (2008) przechowywane Procs, który wykonuje doskonale dobrze:

    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

Więc pytanie do was brzmi, czy jest możliwość zrobienia czegoś w stylu:

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

Abym mógł ponownie wykorzystać te dane z pamięci w innych poniższych instrukcjach? SQL Server rzuca dopasowanie z powyższą instrukcją, jednak nie chcę tworzyć oddzielnych zmiennych i inicjalizować każdą z nich za pomocą oddzielnej instrukcji SELECT przeciwko ten sam stolik.... UGH!!!

Jakieś sugestie, jak osiągnąć coś wzdłuż linii bez wielu zapytań przeciwko tej samej tabeli?

Author: RichardTheKiwi, 2011-01-28

6 answers

Nie można wybrać .. Do .. zmienna tabeli. Najlepsze, co możesz zrobić, to najpierw go utworzyć, a następnie wstawić do niego. Twój drugi fragment musi być

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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-28 01:34:11

Jeśli chcesz po prostu przypisać kilka zmiennych do późniejszego wykorzystania, możesz zrobić je w jednym ujęciu z czymś w następujący sposób:

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

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

Jeśli tego typu rzeczy szukasz

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-08-30 16:35:25

Możesz to zrobić:

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

Potem

SELECT CustomerId FROM #tempCustomer

Nie musisz deklarować struktury #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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-30 00:45:04

Wygląda na to, że Twoja składnia jest nieco poza. To ma kilka dobrych przykładów

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

Potem

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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-28 01:34:29

Wygląda na to, że chcesz tabel tymczasowych. http://www.sqlteam.com/article/temporary-tables

Zauważ, że #TempTable jest dostępny w całym Twoim SP.

Uwaga # # kuszący jest dostępny dla wszystkich.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-28 01:35:09
"SELECT *
  INTO 
    @TempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId"

Co oznacza utworzenie nowej tabeli @tempCustomer i wstawienie danych od klienta. Już to zadeklarowałeś powyżej, więc nie ma potrzeby ponownego deklarowania. Lepiej iść z

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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-08 07:07:23