Ошибка преобразования при преобразовании значения nvarchar в int - PullRequest
3 голосов
/ 27 января 2010

Объявить @count nvarchar (max)

set @count ='select COUNT(*) from '+ @tablename+''

if( @count =0 )
begin 
  print 'fail'
end
else
begin
  print 'success'
end
end

переменная @count не получает значение 0. Она показывает ошибку как

Не удалось выполнить преобразование при преобразовании значения nvarchar «выберите COUNT (*) из имени таблицы» в тип данных int.

Ответы [ 4 ]

5 голосов
/ 27 января 2010
DECLARE @Count INTEGER
DECLARE @nSQL NVARCHAR(1000)
SET @nSQL = 'SELECT @Count = COUNT(*) FROM ' + @tablename
EXECUTE sp_executesql @nSQL, N'@Count INTEGER OUT', @Count OUT

-- Now check @Count

Будьте особенно осторожны с такими динамическими SQL, как вы открываете себя для SQL инъекций. Поэтому убедитесь, что @tablename очищено.

Одна проверка для обеспечения безопасности будет выглядеть примерно так: убедитесь, что таблица существует с использованием параметризованного запроса, прежде чем пытаться выполнить динамический запрос:

DECLARE @Count INTEGER
DECLARE @nSQL NVARCHAR(1000)
SET @nSQL = 'IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME=@TableName) 
    SELECT @Count = COUNT(*) FROM ' + @tablename + '
ELSE
    SELECT @Count = -1'

EXECUTE sp_executesql @nSQL, N'@TableName NVARCHAR(128), @Count INTEGER OUT', @TableName, @Count OUT

Если @Count выходит на -1, вы знаете, что это потому, что имя таблицы неверно

Edit:
Ссылка на sp_executesql здесь

3 голосов
/ 27 января 2010

Это должно работать:

DECLARE @SQLString nvarchar(500);
DECLARE @ParmDefinition nvarchar(500);
DECLARE @count int

SET @SQLString = N'SELECT @CountOUT = COUNT(*) FROM ' + @tablename;
SET @ParmDefinition = N'@CountOUT int OUTPUT';

EXECUTE sp_executesql @SQLString, @ParmDefinition, @CountOUT=@count OUTPUT;

SELECT @count;
2 голосов
/ 27 января 2010

Ознакомьтесь со стандартной статьей Эрланда по Динамический SQL . Вы также «жертва» Тип данных Precedences

1 голос
/ 27 января 2010

Попробуйте объявить @count как int:

DECLARE @count AS INT
SELECT @count = COUNT(*) FROM YourTable

Проблема в том, что если вы делаете

SELECT @countAsString = 'SELECT ...'

тогда @countAsString (будучи строкой) будет содержать не результат запроса, а саму строку.

Используйте EXEC для фактического выполнения динамически созданного запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...