我使用了以下动态查询
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);
我在语法上做错了还是根本不可能?
答案 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注入Convert
功能答案 1 :(得分:0)
您可以尝试添加以下引号
EXEC('SELECT COUNT(*) FROM ' + @TableName1 +' AND CONVERT(VARCHAR(10),CAST(InsertedDate AS DATE),120) = '''+@InsertedDate + '')
否则,您可以添加参数并将该参数发送到sp_executesql
答案 2 :(得分:0)
有两个语法问题
$count = $stmt->rowCount();
子句您需要将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)