2011-01-28 84 views
183

我有我的SQL(2008)存儲特效之一下面的代碼,其執行完美的罰款:SQL Server SELECT INTO @variable?

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 

所以對於你們的問題是有可能做到的線沿線的東西:

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 

這樣我可以在其他以下語句中從內存中重用這些數據嗎? SQL Server拋出一個適合上述語句,但我不想創建單獨的變量,並通過單獨的SELECT語句對同一個表進行初始化。

任何關於如何實現某些事情的建議沒有針對同一個表的多個查詢?

+1

「創建單獨的變量並通過單獨的SELECT語句初始化它們中的每一個」 - 爲什麼你需要這樣做? `聲明@t table`一次,如果你需要重用它,在再次插入之前觸發`DELETE @ TempCustomer` – RichardTheKiwi 2011-01-28 01:40:41

回答

165

您不能SELECT .. INTO .. TABLE VARIABLE。你可以做的最好的是先創建它,然後插入它。你的第二個片段必須是

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 
+4

應該注意,這在CTE上下文中工作得很好。 Bazinga! – 2011-12-20 22:23:58

+2

任何人都有一個答案*爲什麼*不能像選擇一個實際的臨時表一樣選擇一個表變量? – KSwift87 2016-06-30 17:15:29

13

它看起來像你的語法稍微出來。這有一些good examples

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 

再後來

SELECT CustomerId FROM @TempCustomer 
2

聽起來像是你想臨時表。 http://www.sqlteam.com/article/temporary-tables

請注意#TempTable在整個SP中都可用。

請注意## TempTable適用於所有人。

+2

## temptable - 直到所有者(創建者)刪除它或斷開連接 – RichardTheKiwi 2011-01-28 01:38:27

+3

我不想臨時表。臨時表是昂貴且緩慢的。我只想在少量時間內爲特定記錄保留一些數據,並使其可用於多個sql語句,而無需後續查找。由於表變量在它們被定義的存儲過程中具有作用域,所以它們是用於存儲該存儲的proc調用的數據的完美解決方案... – bleepzter 2011-01-28 01:48:36

+3

我也忘記提及DB駐留在Azure中......我不知道我們不想介紹一下管理臨時表的麻煩。 – bleepzter 2011-01-28 01:49:53

21

,你可以這樣做:

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

後來

SELECT CustomerId FROM #tempCustomer 

你並不需要聲明#tempCustomer

384

如果你想簡單地指定某些變量的結構以後使用,你可以用這樣一行來做一下:

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

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

如果這是你太太的事情

-1
"SELECT * 
    INTO 
    @TempCustomer 
FROM 
    Customer 
WHERE 
    CustomerId = @CustomerId" 

這意味着創建一個新的@tempCustomer tablevariable從客插入數據後的類型。您已經在上面聲明瞭,所以不需要再次聲明。最好與

INSERT INTO @tempCustomer SELECT * FROM Customer