【问题标题】:Using an int type variable in dynamic sql在动态 sql 中使用 int 类型变量
【发布时间】:2017-09-01 17:32:19
【问题描述】:

当我运行以下代码时:

DECLARE @FundConfigSetID INT = 1
DECLARE @sql NVARCHAR(MAX)

SET @sql = 'SELECT * FROM Correct.PolicyDetail C
            INNER JOIN config.fund f ON C.longfundid IN (f.fundid, f.longfundid)
                                     AND f.FundConfigSetID = ' + @FundConfigSetID

EXEC(@sql)

我收到此错误:

消息 245,第 16 级,状态 1,第 4 行
转换 varchar 值 'SELECT * From Correct.PolicyDetail C 时转换失败 内连接 config.fund f 关于 C.longfundid 在 (f.fundid, f.longfundid) 和 f.FundConfigSetID = ' 到数据类型 int。

我假设我的语法不正确

 and f.FundConfigSetID = '+@FundConfigSetID

有什么建议吗?

【问题讨论】:

    标签: sql sql-server variables dynamic


    【解决方案1】:

    您需要将cast int 附加到一个字符串类型时将其附加到一个sql字符串:

    CAST(@FundConfigSetID AS NVARCHAR(10))
    

    完整的 SQL:

    DECLARE @FundConfigSetID INT = 1;
    
    DECLARE @sql NVARCHAR(MAX);
    SET @sql = 'SELECT * FROM Correct.PolicyDetail C
    inner join config.fund f
        on C.longfundid in (f.fundid, f.longfundid)
        and f.FundConfigSetID = ' +  CAST(@FundConfigSetID AS NVARCHAR(10))
    
    EXEC(@sql);
    

    查看文档:

    CAST and CONVERT (Transact-SQL)

    将一种数据类型的表达式转换为另一种数据类型。

    由于您的变量是 int 值,SQL 正在尝试将 SQL 子句的其余部分转换为 int,因为它认为您正在尝试将这 2 个值相加,这就是错误归结为.通过将其转换为字符串类型,它知道您要将两个字符串附加在一起。

    要突出显示相反的内容,第一个字符串是数字:

    DECLARE @FundConfigSetID INT = 1;
    
    DECLARE @sql NVARCHAR(MAX);
    SET @sql = '1' +  @FundConfigSetID
    
    PRINT @sql
    -- output = 2
    

    【讨论】:

      【解决方案2】:

      几个快速简单的选项

      DECLARE @FundConfigSetID varchar(25) = 1
      

      ...'+cast(@FundConfigSetID as varchar(25))
      

      【讨论】:

        【解决方案3】:

        你需要先将 int 转换为 varchar

        DECLARE @FundConfigSetID int = 1
        
        Declare @sql nvarchar(max)
        SET @sql ='SELECT * FROM Correct.PolicyDetail C
          inner join config.fund f 
            on C.longfundid in (f.fundid, f.longfundid)
           and f.FundConfigSetID = '+ convert(varchar, @FundConfigSetID)
        
        Exec(@sql)
        

        【讨论】:

          【解决方案4】:

          需要将int转换为varchar,否则Sql server会尝试将varchar隐式转换为int:

          '.... and f.FundConfigSetID = '+ CAST(@FundConfigSetID as varchar(10))
          

          【讨论】:

            【解决方案5】:

            它正在尝试将您的变量(一个 int)添加到查询的其余部分。这是一个快速解决方案,可以解决您的问题:

            DECLARE @FundConfigSetID int = 1
            
            Declare @sql nvarchar(max)
            SET @sql ='SELECT * FROM Correct.PolicyDetail C
            inner join config.fund f
                on C.longfundid in (f.fundid, f.longfundid)
                and f.FundConfigSetID = '+ CAST(@FundConfigSetID AS NVARCHAR(10))
            
            Exec(@sql)
            

            【讨论】:

              猜你喜欢
              • 2011-06-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-04-12
              • 2019-11-22
              • 2021-12-29
              相关资源
              最近更新 更多