在SQL Server 2014中键入转换问题

时间:2016-10-14 09:21:36

标签: 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 COUNT(*)  
FROM TableName  
WHERE CONVERT(VARCHAR(10), CAST(InsertedDate AS DATE), 120) = @InsertedDate

这些是变量类型

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

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

4 个答案:

答案 0 :(得分:1)

我将使用parameterized queries

执行此操作
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功能

答案 1 :(得分:0)

您可以尝试添加以下引号

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

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

答案 2 :(得分:0)

有两个语法问题

  1. SQL查询中缺少$count = $stmt->rowCount(); 子句
  2. 您需要将WHERE日期包装在单引号中,请尝试使用以下字符串

    @InsertedDate

答案 3 :(得分:0)

为了避免这些类型的问题,我将简单地使用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)