SQL Server SELECT INTO @variable?

我有以下代码在我的Sql(2008)存储Procs执行完美:

    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语句对同一个表....初始化它们中的每一个啊! !

关于如何在不对同一个表进行多次查询的情况下实现某些功能,有什么建议吗?

960655 次浏览

你不能选择..到. .表变量。最好的方法是先创建它,然后再插入它。你的第二个片段必须是

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

看起来你的语法有点错误。它有一些很好的例子

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

听起来你想要临时表。 http://www.sqlteam.com/article/temporary-tables < / p >

注意,#TempTable在整个SP中都可用。

注意,##TempTable对所有人都可用。

你可以这样做:

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

之后

SELECT CustomerId FROM #tempCustomer

你不需要声明#tempCustomer的结构

如果你想简单地分配一些变量以供以后使用,你可以通过以下方式一次性完成:

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


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

如果这是你想要的东西的话

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

这意味着创建一个新的@tempCustomer表变量并插入来自Customer的数据。你已经在上面声明过了,所以没有必要再声明。更好的选择是

INSERT INTO @tempCustomer SELECT * FROM Customer

我发现你的问题是在寻找同一个问题的解决方案;其他答案没有指出的是,在每次执行过程时使用变量以永久形式而不是临时形式更改表的名称。

到目前为止,我所做的是将整个SQL代码与要使用的变量连接起来。是这样的:

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''
');

我希望它能有所帮助,但如果代码太大,它可能会很麻烦,所以如果你找到了更好的方法,请分享!