繁体   English   中英

将 SQL 查询结果传递给存储过程参数

[英]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

如果您知道在哪里查找,文档中提供了几乎所有内容的解释。 我想这就是搜索引擎的用途:-)

批次

为了重现该错误,我必须假设您正在两个不同的批次中运行两个查询:

  1. DECLARE @datev varchar...
  2. EXEC Product_Movemnet1 @datev

定义批次

如果您正在使用 SQL Server Management Studio (SSMS) 来查询您的 Microsoft SQL Server 数据库,那么该批次的 scope可以定义多种方式:

  1. 通过查询 window:默认情况下,一个查询 window 中的所有 SQL 语句构成一批。

  2. 通过在查询之间添加GO语句,您可以对查询进行分组并定义单独的批次。

    GO文档摘录:

GO 向 SQL 服务器实用程序发出一批 Transact-SQL 语句结束的信号。

  1. 通过在查询 window 中仅选择 SQL 语句的一部分。

    SSMS 快捷方式文档摘录:

如果未选择任何内容,则运行查询编辑器的选定部分或整个查询编辑器

变量

批次 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM