[英]Pass SQL query result to stored procedure parameter
我有一个 SQL 查询,它在varchar
中返回一个结果,然后我试图将该结果传递给一个存储过程参数,但我收到一个错误
必须声明标量变量“@datev”
SQL:
DECLARE @datev varchar
SELECT
CONVERT(varchar, (CASE
WHEN DATENAME (dw, GETDATE()) IN ('Thursday')
THEN CONVERT (varchar, DATEADD(d, -6, GETDATE()), 112)
WHEN DATENAME (dw, GETDATE()) IN ('Friday')
THEN CONVERT (varchar, DATEADD(d, -7, GETDATE()), 112)
WHEN DATENAME (dw, GETDATE()) IN ('Saturday')
THEN CONVERT (varchar, DATEADD(d, -8, GETDATE()), 112)
WHEN DATENAME (dw, GETDATE()) IN ('Sunday')
THEN CONVERT (varchar, DATEADD(d, -9, GETDATE()), 112)
ELSE CONVERT(varchar, DATEADD(d, -((DATEPART (weekday, GETDATE()) + 1 + @@DATEFIRST) % 14), GETDATE()), 112)
END), 112) AS rptdate
INTO
#rwed
SELECT rptdate FROM #rwed
SELECT @datev = rptdate FROM #rwed
程序要调用:
EXEC Product_Movemnet1 @datev
如果您知道在哪里查找,文档中提供了几乎所有内容的解释。 我想这就是搜索引擎的用途:-)
为了重现该错误,我必须假设您正在两个不同的批次中运行两个查询:
DECLARE @datev varchar...
EXEC Product_Movemnet1 @datev
如果您正在使用 SQL Server Management Studio (SSMS) 来查询您的 Microsoft SQL Server 数据库,那么该批次的 scope可以定义多种方式:
通过查询 window:默认情况下,一个查询 window 中的所有 SQL 语句构成一批。
通过在查询之间添加GO
语句,您可以对查询进行分组并定义单独的批次。
GO
文档摘录:
GO 向 SQL 服务器实用程序发出一批 Transact-SQL 语句结束的信号。
如果未选择任何内容,则运行查询编辑器的选定部分或整个查询编辑器
批次 scope 与您问题中的错误有什么关系? 好吧,您代码中的@datev
称为变量。 您定义它的方式使其成为局部变量。
变量文档摘录:
Transact-SQL 局部变量是一个 object,它可以保存特定类型的单个数据值。
阅读变量的DECLARE
语法然后解释你的错误。
DECLARE
文档摘录:
局部变量的 scope 是声明它的批次。
换句话说:局部变量只存在于单个 SQL 语句批处理的生命周期内。
执行声明您的变量的语句,设置您的变量并在一批中使用您的变量,解决错误。
小提琴以查看重现和解决的错误。
您当前的解决方案可能不会产生您所追求的结果(请参阅问题评论中有关数据类型varchar
的注释中没有指定长度)。 此外,它可以缩短一点:
-- attempt at improved version
-- + replace "varchar" with "varchar(10)"
-- + remove use of temporary table #rwed
-- + convert to string _once_
-- + replace "IN" with "=" for list with only one item
DECLARE @datev varchar(10);
SELECT @datev = CONVERT(varchar(10),
(CASE WHEN DATENAME(dw, GETDATE()) = 'Thursday' THEN DATEADD(d, -6, GETDATE())
WHEN DATENAME(dw, GETDATE()) = 'Friday' THEN DATEADD(d, -7, GETDATE())
WHEN DATENAME(dw, GETDATE()) = 'Saturday' THEN DATEADD(d, -8, GETDATE())
WHEN DATENAME(dw, GETDATE()) = 'Sunday' THEN DATEADD(d, -9, GETDATE())
ELSE DATEADD(d, -((DATEPART (weekday, GETDATE()) + 1 + @@DATEFIRST) % 14), GETDATE())
END), 112);
EXEC Product_Movement1 @datev;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.