2016-10-14 91 views
2

我已經使用了以下動態查詢類型轉換問題在SQL Server 2014

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

引發錯誤:將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

我不記得何時'AND'成爲SELECT列表的一部分。 –

回答

0

你可以嘗試添加報價如下

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

否則,您可以添加參數和發送參數sp_executesql的

0

有兩種語法問題在SQL查詢

  1. 缺少WHERE條款
  2. 您需要將@InsertedDate的日期換成s英格爾報價的,請嘗試以下字符串

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

最好建議使用'...'+ QUOTENAME(@ TableName1)+'...'來避免SQL注入攻擊。 –

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功能
0

爲了避免這些類型的問題,我會簡單地使用替換功能來建立查詢使用參數如下。

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)