SQL Server SELECT INTO @variable?

ble*_*ter 235 sql t-sql sql-server sql-server-2008

我在我的一个Sql(2008)存储过程中有以下代码执行完全正常:

    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
Run Code Online (Sandbox Code Playgroud)

所以你们的问题是有可能做一些事情:

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
Run Code Online (Sandbox Code Playgroud)

这样我可以在以下其他语句中重用内存中的这些数据?SQL Server与上面的语句一致,但是我不想创建单独的变量并通过针对同一个表的单独SELECT语句初始化它们中的每一个.... UGH !!!

关于如何在没有针对同一个表的多个查询的情况下实现某些事情的任何建议?

dou*_*ald 479

如果你想简单地指定一些变量供以后使用,你可以一次性完成这些变换:

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

select 
    @var1 = field1,
    @var2 = field2,
    @var3 = field3
from
    table
where
    condition
Run Code Online (Sandbox Code Playgroud)

如果这就是你追求的东西

  • 要强制查询返回单行,请使用SELECT TOP 1 (8认同)
  • 最佳答案恕我直言,但是如果结果不止一个会发生什么? (2认同)

Ric*_*iwi 197

你不能SELECT .. INTO ..一个表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
Run Code Online (Sandbox Code Playgroud)

  • 应该注意,这在CTE环境中也可以正常工作.Bazinga! (5认同)
  • 任何人都有一个答案*为什么*一个人不能像实际的临时表一样选择表变量? (4认同)

Vic*_*loy 30

你可以这样做:

SELECT 
    CustomerId, 
    FirstName, 
    LastName, 
    Email
INTO #tempCustomer 
FROM 
    Customer
WHERE 
    CustomerId = @CustomerId
Run Code Online (Sandbox Code Playgroud)

然后

SELECT CustomerId FROM #tempCustomer
Run Code Online (Sandbox Code Playgroud)

你不需要声明#tempCustomer的结构

  • 当不再需要`#tempCustomer`时,不要忘记添加`DROP TABLE #tempCustomer`,否则下一个select会导致`#tempCustomer已经存在'错误 (5认同)
  • @webturner这两点都不对.临时表的范围不在proc之外,表变量不再是临时表的"仅内存". (3认同)

小智 14

看起来你的语法略有不同.这有一些很好的例子

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
Run Code Online (Sandbox Code Playgroud)

然后

SELECT CustomerId FROM @TempCustomer
Run Code Online (Sandbox Code Playgroud)