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有两个语法问题
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
- 添加了
函数以避免SQL注入QUOTENAME
- 再次参数化查询以避免SQL注入
- 删除了不必要的
功能Convert
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注入攻击。