【问题标题】:sp_executesql with datetime output parameter带日期时间输出参数的 sp_executesql
【发布时间】:2016-01-20 10:02:01
【问题描述】:

我在 SQL Server 中遇到了问题。我必须使用存储过程sp_executesql 这是一个系统过程,因为我在其上执行选择子句的表取决于其他参数。

这里是示例:

@p_Origin 是我的程序中给出的一个参数,所以要重现问题,让我们这样声明:

DECLARE @p_Origin nvarchar(255) = 'Sales'

我的SELECT 子句中还有一个参数,即目标表的列:

DECLARE @v_valueVersion as int 
IF @p_Origin = 'Sales'  
    SET @v_valueVersion = (SELECT VersionId FROM Version WHERE ...)
ELSE IF 
    ...

但是现在,我想从我的原始表中取回一列,(这里是Sales) 使用此查询:

DECLARE @v_query as nvarchar(max) = 'SELECT MAX(Date) FROM dbo.' + @p_Origin + ' WHERE VersionId = ' + CAST(@v_valueVersion as nvarchar) + ' AND Month = CONVERT(NVARCHAR(6),GETDATE(),112) '

date这个专栏是一个datetime专栏,在这里声明:(Month专栏和date专栏是两个不同的东西,它们不是指同一时期)

DECLARE @v_maxDate as datetime  

这是我的问题:

EXEC sp_executesql @v_query, N'@v_maxDate datetime out', @v_maxDate out

当我得到这个时,SELECT 子句给了我以下结果,这是一个很好的结果:

-----------------------
2016-01-19 15:49:58.000

但是当我PRINT这个值的时候,什么都没有打印出来,这个值就是null。如何使用此存储过程取回一些日期时间值?甚至可能吗?

编辑: 正如 Adwaenyth 所说,以下查询完美运行:

DECLARE @query nvarchar(max) = 'SELECT  @v_maxDate = MAX(create_date) FROM sys.tables'
DECLARE @v_maxDate datetime

EXEC sp_executesql @query, N'@v_maxDate datetime out', @v_maxDate out

PRINT @v_maxDate

我在查询中使用多个变量这一事实是否可能会修改结果?

【问题讨论】:

    标签: sql sql-server datetime stored-procedures


    【解决方案1】:

    将您的查询更改为

    DECLARE @v_query as nvarchar(max) = 'SELECT @v_maxDate = MAX(DATE) FROM dbo.' + @p_Origin + ' WHERE VersionId = ' + CAST(@v_valueVersion as nvarchar) + ' AND Month = CONVERT(NVARCHAR(6),GETDATE(),112) '
    

    它应该可以工作。

    /edit:我自己用这个临时查询试了一下,效果很好:

    DECLARE @query nvarchar(max) = 'SELECT  @v_maxDate = MAX(create_date) FROM sys.tables'
    DECLARE @v_maxDate datetime
    
    EXEC sp_executesql @query, N'@v_maxDate datetime out', @v_maxDate out
    
    PRINT @v_maxDate
    

    准确打印输出:

    2016 年 1 月 18 日下午 1:10

    也许尝试运行上面的查询,看看它是否在你的服务器上运行...如果是,也许再看看你的查询语法。

    【讨论】:

    • 谢谢 Adwaenyth,我试过这个,但我不工作,当我尝试打印时,我的 @v_maxDate 仍然为空。但是我的SELECT 子句的结果现在在列的顶部有一个名称,即@v_maxDate
    • 查看编辑。我自己试了一下,效果很好……也许可以试试上面的简单查询,看看它是否在你的服务器上有效。
    • 你说得对,这个工作完美......我不明白为什么它不适用于另一个!
    • 我不知道如果我遗漏了什么,如果没有人就我的情况给我建议,我会尽快接受您的回复..
    【解决方案2】:

    非常感谢您提供此信息。我有同样的问题,这帮助我解决了它。

    以下是我的理解:使用 sp_executesql 将查询结果分配给变量时,该变量必须是查询本身的一部分。也就是说,(在概念上)在步骤 1 中运行查询({query} = "SELECT Max(Date) FROM {table}...")然后在步骤 2 中将输出分配给一个变量(例如,sp_executesql {query}、@varOut OUTPUT)。这就是 OP 最初的做法,也是我最初的做法。相反,查询本身必须一步将结果分配给变量:“SELECT @varOut = Max(Date) FROM {table}...”

    似乎第一种方法以“正常”方式运行查询(即,就好像它是在命令行中手动键入的一样),因此将结果正常发送到 STDOUT。正如 OP 所见,这使得 Max(Date) 在屏幕上可见。但是输出没有分配给变量。相反,sp_exectuesql 必须有某种成功/失败指示,它默认返回。这是 OP 在打印 @varOut 的值时看到的。

    再次感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-15
      • 2021-11-16
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多