【问题标题】:Finding the item count in stored procedure在存储过程中查找项目计数
【发布时间】:2019-09-24 06:51:20
【问题描述】:

我想查找 col_name 的空值数。我在 SSMS 中使用以下代码:

DECLARE @NumNull INT = N'SELECT COUNT(*) FROM ' + @WhichTable + N' WHERE col_name IS NULL'

我已在程序开始时将 @WhichTable 声明为 NVARCHAR(MAX)。

我收到此错误消息:

消息 245,级别 16,状态 1,过程 sp_FILL_CHAIN_NAMES,第 22 行
将 nvarchar 值 'SELECT COUNT(*) FROM UNION_ALL WHERE col_name IS NULL' 转换为数据类型 int 时转换失败。

我不知道如何重写这段 SQL 代码?我试过exec(),甚至是SQL,但它似乎不起作用!

【问题讨论】:

  • 您所有的表都有一个名为 col_name 的列?
  • 显然它是一个字符串。为什么将变量声明为INT
  • 也许谷歌怎么做动态SQL。

标签: sql-server stored-procedures


【解决方案1】:

您试图将整个 SELECT 语句存储在一个 int 变量中,而不是您选择的结果。

你需要:

  1. 将您的 SQL 存储在 NVARCHAR 变量中。
  2. 使用 sp_executesql 来执行它。

那里有很好的例子: https://support.microsoft.com/en-us/help/262499/how-to-specify-output-parameters-when-you-use-the-sp-executesql-stored

【讨论】:

    【解决方案2】:

    您需要使用 sp_executesql 从动态 sql 分配结果

    DECLARE @WhichTable nvarchar(max)= 'Categories'
    declare @NumNull int 
    DECLARE @sql nvarchar(max)
    
    Set @sql = 'SELECT @NumNull = COUNT(*) FROM ' + @WhichTable + ' WHERE CategoryId IS NOT NULL';
    execute sp_executesql 
        @sql, 
        N'@NumNull int OUTPUT', 
        @NumNull = @NumNull output;
    select @NumNull;
    

    【讨论】:

    • 感谢代码演示。我阅读了有关 sp_executesql 的信息,但我对 Transact SQL 代码有点陌生。你的代码向我展示了这个 sp 的基本元素是什么。
    猜你喜欢
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-18
    • 1970-01-01
    相关资源
    最近更新 更多