2013-09-19 8 views
0

Я хочу получить значения @sql в p. Но при преобразовании говорится, что «Преобразование не удалось при преобразовании значения nvarchar» выберите сумму (запас) с [Жесткий диск] в тип данных int. "Не удалось преобразовать при преобразовании значения nvarchar в datatype int

declare @tname varchar(10); 
declare @p int 
declare @i int 

declare @sql nvarchar(max); 

set @tname = 'Hard disk'; 

set @sql = 'select sum(stock) from' + '[' + @tname + ']' 

exec (@sql) 

print @sql 

select @p = convert(int,@sql) 

print @p 

Что я хочу, чтобы присвоить результат @sql запроса в целой переменной @p ..

+0

возможно дубликат [Как результат динамического SQL в переменной] (http://stackoverflow.com/questions/3840730/getting-result-of-dynamic-sql-into-a-variable) – cha

ответ

0

Один из способов сделать это, это сделать все это в динамическом SQL.

declare @tname varchar(10); 
declare @p int 
declare @i int 

declare @sql nvarchar(max); 

set @tname = 'Hard disk'; 

set @sql = 
'DECLARE @Result AS INT 
select @Result = sum(stock) from' + '[' + @tname + '] 
PRINT @Result' 

exec (@sql) 

Другой способ - создать выходной параметр.

DECLARE @tname VARCHAR(50) 
DECLARE @SQLString NVARCHAR(500) 
DECLARE @ParmDefinition NVARCHAR(500) 
DECLARE @Result INT 

SET @tname = 'Hard disk'; 
SET @SQLString = N'SELECT @Result = sum(stock) 
        FROM ' + QUOTENAME(@tname) 
SET @ParmDefinition = N'@Result INT OUTPUT' 
EXECUTE sp_executesql 
@SQLString, 
@ParmDefinition, 
@[email protected] OUTPUT 

PRINT @Result 

вам лучше использовать QUOTENAME для embrasing имя таблицы со скобками, так как он более родной.

+0

I не может использовать первый, поскольку мне нужно выполнить некоторые целые операции над полученным значением. Но второй выглядит круто. Было бы здорово, если бы вы могли бы также объяснить мне второй вкратце. –

+0

Это стандартный способ использования динамического sql, который возвращает одно или несколько значений. В ParamDefinition вы можете определить больше переменных ввода или вывода, разделенных запятыми. Для входных переменных вам не нужно отмечать их как входные данные. Вы можете увидеть более подробную информацию по адресу http://technet.microsoft.com/en-us/library/ms188001.aspx –

0
declare @p int; 
EXEC SP_EXECUTESQL N'select @p = sum(stock) from '[' + @tname + ']',N'@p int OUTPUT',@p OUTPUT; 
select @p