2016-10-14 4 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); 

я делаю что-то неправильно в синтаксисе или я t вообще невозможно?

+0

Я не помню, когда «И» стало частью списка SELECT. –

ответ

0

Вы можете попробовать добавить кавычки, как показано ниже

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

Else можно добавить параметр и отправить этот параметр в sp_executesql

0

Есть

  1. Отсутствует WHERE статья две синтаксические выпусков в SQL запросе
  2. Вам необходимо обернуть @InsertedDate date in s Ingle цитаты, попробуйте ниже строки

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

Лучше всего использовать '... '+ QUOTENAME (@ TableName1) +' ...', чтобы избежать атак SQL Injection. –

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 Injection
  • параметрироваться запрос еще раз, чтобы избежать SQL Injection
  • Удалены ненужные Convert функцию
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) 
Смежные вопросы