SQL Server选择进入@variable?
我的一个Sql 2008存储过程中有以下代码,执行得非常好:SQL Server选择进入@variable?,sql,sql-server,tsql,sql-server-2008,Sql,Sql Server,Tsql,Sql Server 2008,我的一个Sql 2008存储过程中有以下代码,执行得非常好: CREATE PROCEDURE [dbo].[Item_AddItem] @CustomerId uniqueidentifier, @Description nvarchar(100), @Type int, @Username nvarchar(100), AS BEGIN DECLARE @TopRelatedItemId
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
所以,你们的问题是,有没有可能按照以下思路做点什么:
这样我就可以在下面的语句中重用内存中的数据了?SQL Server与上面的语句相匹配,但是我不想创建单独的变量,并通过一个单独的SELECT语句对同一个表初始化其中的每个变量。。。。啊
关于如何在不对同一张表进行多次查询的情况下实现某些目标,您有什么建议吗?您不能选择。。进入表变量。您最好先创建它,然后再插入其中。你的第二个片段必须是
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
看起来你的语法有点错误。这有一些 后来
SELECT CustomerId FROM @TempCustomer
听起来你想要临时表。 请注意,整个SP中都提供了诱惑功能 请注意,所有人都可以使用诱惑功能。您可以执行以下操作:
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 tablevariable并从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''
');
我希望它能有所帮助,但如果代码太大,可能会很麻烦,所以如果你找到了更好的方法,请分享 诱惑-在所有者创建者删除它或断开连接之前,我不想要临时表。临时桌既昂贵又慢。我只想在一小段时间内为特定记录保留一点数据,并使其可用于多个sql语句,而无需后续查找。由于表变量的作用域在存储过程中定义,因此它们是存储一个存储过程调用的元组数据的完美解决方案…我还忘了提到数据库驻留在Azure中。。。。我不想给临时表的管理带来混乱。变量表是一种方法。声明@varTable Table…。创建单独的变量并通过单独的SELECT语句初始化每个变量-为什么需要这样做?声明@t table一次,如果需要重用它,则在再次插入@t table之前触发DELETE@TempCustomer。请注意,这在CTE上下文中也可以正常工作。巴辛加!有人能回答为什么不能像使用实际的临时表那样选择表变量吗?@webturner这两点都不正确。临时表的作用域不在proc之外,表变量的内存也不比临时表多。当不再需要临时表时,不要忘记添加一个DROP table TEMPCUSTER,否则下一次选择将导致TEMPCUSTER已存在错误最佳答案imho,但是如果结果不止一个会发生什么呢?如果结果不止一个,您将得到一个可用值。这可能会成为一个有趣的谜题!请参见强制查询返回单行的步骤使用SELECT TOP1@Adrian是的,上面的查询假设您选择了一行。如果您想要更奇特的逻辑,还可以使用排序和聚合函数。如果您不使用OP使用的数据库类型,则并非所有函数都支持Adrian提到的TOP 1。SQL Server/MS Access使用TOP,MySQL使用LIMIT,Oracle使用ROWNUM。有关详细信息,请参阅。它不起作用。您仍然需要事先声明表变量。由于来自dbforums的重定向,该“好例子”链接已转换为广告。是否有更好的链接满足您的要求?
INSERT INTO @tempCustomer SELECT * FROM Customer
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''
');