Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server 2014中的类型转换问题_Sql Server_Sql Server 2014_Dynamic Sql - Fatal编程技术网

Sql server SQL Server 2014中的类型转换问题

Sql server SQL Server 2014中的类型转换问题,sql-server,sql-server-2014,dynamic-sql,Sql Server,Sql Server 2014,Dynamic Sql,我使用了以下动态查询 EXEC('SELECT COUNT(*) FROM ' + @TableName1 +' AND CONVERT(VARCHAR(10),CAST(InsertedDate AS DATE),120) = '+@InsertedDate) 出现一个错误: 将varchar值“2016-10-13”转换为数据类型int时,转换失败 我试图参数化我的sql查询,但是当我尝试使用变量名作为表名时,它显示了上面的消息 如果不使用EXEC,则相同的查询工作正常: SELECT

我使用了以下动态查询

EXEC('SELECT COUNT(*)  FROM ' + @TableName1 +' AND CONVERT(VARCHAR(10),CAST(InsertedDate AS DATE),120) = '+@InsertedDate)
出现一个错误:

将varchar值“2016-10-13”转换为数据类型int时,转换失败

我试图参数化我的sql查询,但是当我尝试使用变量名作为表名时,它显示了上面的消息

如果不使用EXEC,则相同的查询工作正常:

SELECT COUNT(*)  
FROM TableName  
WHERE CONVERT(VARCHAR(10), CAST(InsertedDate AS DATE), 120) = @InsertedDate
这些是变量类型

Declare @InsertedDate nvarchar(50);
Declare @TableName1 nvarchar(500);

我是在语法上做错了还是根本不可能?

您可以尝试添加引号,如下所示

EXEC('SELECT COUNT(*) FROM ' + @TableName1 +' AND CONVERT(VARCHAR(10),CAST(InsertedDate AS DATE),120) = '''+@InsertedDate + '')

否则,您可以添加参数并将该参数发送到sp_executesql

有两个语法问题

  • SQL查询中缺少
    WHERE
    子句
  • 您需要将
    @InsertedDate
    日期用单引号括起来,请在字符串下方尝试

    EXEC('SELECT COUNT(*) FROM ' + @TableName1 +' WHERE CONVERT(VARCHAR(10),CAST(InsertedDate AS DATE),120) = '''+@InsertedDate+'''')
    

  • 我将使用
    参数化查询

    DECLARE @SQL NVARCHAR(MAX)=''
    
    SET @SQL ='SELECT COUNT(*)  FROM ' + Quotename(@TableName1) + ' Where CAST(InsertedDate AS DATE) = @InsertedDate'
    
    EXEC Sp_executesql
      @SQL,
      N'@InsertedDate DATETIME',
      @InsertedDate = @InsertedDate 
    
    我做了一些改变

    • 添加了代码中缺少的
      Where
      子句
    • 添加了
      QUOTENAME
      函数以避免SQL注入
    • 再次参数化查询以避免SQL注入
    • 删除了不必要的
      Convert
      功能

    为了避免这些类型的问题,我将简单地使用Replace函数构建带有如下参数的查询

        DECLARE @TableName1 VARCHAR(10)='MYTABLE' , @InsertedDate VARCHAR(20)='''2016-01-01'''
    
        DECLARE @SQL NVARCHAR(MAX)='SELECT COUNT(*) FROM @TableName1  
        WHERE  CONVERT(VARCHAR(10),CAST(InsertedDate AS DATE),120) = @InsertedDate'
    
        SELECT @SQL =  REPLACE (@SQL,'@TableName1', @TableName1);
        SELECT @SQL = REPLACE (@SQL, '@InsertedDate', @InsertedDate);
    
        EXEC(@SQL)
    

    我不记得“和”何时成为选择列表的一部分。最好建议使用
    ..+QUOTENAME(@TableName1)+’…
    以避免SQL注入攻击。