8 ответов:
Если у вас есть выходные параметры, вы можете сделать
DECLARE @retval int DECLARE @sSQL nvarchar(500); DECLARE @ParmDefinition nvarchar(500); DECLARE @tablename nvarchar(50) SELECT @tablename = N'products' SELECT @sSQL = N'SELECT @retvalOUT = MAX(ID) FROM ' + @tablename; SET @ParmDefinition = N'@retvalOUT int OUTPUT'; EXEC sp_executesql @sSQL, @ParmDefinition, @retvalOUT=@retval OUTPUT; SELECT @retval;но если вы этого не сделаете, и не можете изменить SP:
-- Assuming that your SP return 1 value create table #temptable (ID int null) insert into #temptable exec mysp 'Value1', 'Value2' select * from #temptableне очень красиво, но работает.
DECLARE @tab AS TABLE (col VARCHAR(10), colu2 varchar(10)) INSERT into @tab EXECUTE sp_executesql N'SELECT 1 as col1, 2 as col2 union all SELECT 1 as col1, 2 as col2 union all SELECT 1 as col1, 2 as col2' SELECT * FROM @tab
DECLARE @vi INT DECLARE @vQuery VARCHAR(1000) SET @vQuery = 'SELECT @vi= COUNT(*) FROM <TableName>' EXEC SP_EXECUTESQL @Query = @vQuery , @Params = N'@vi INT OUTPUT' , @vi = @vi OUTPUT SELECT @vi
Если вы хотите вернуть более 1 значение используйте это:
DECLARE @sqlstatement2 NVARCHAR(MAX); DECLARE @retText NVARCHAR(MAX); DECLARE @ParmDefinition NVARCHAR(MAX); DECLARE @retIndex INT = 0; SELECT @sqlstatement = 'SELECT @retIndexOUT=column1 @retTextOUT=column2 FROM XXX WHERE bla bla'; SET @ParmDefinition = N'@retIndexOUT INT OUTPUT, @retTextOUT NVARCHAR(MAX) OUTPUT'; exec sp_executesql @sqlstatement, @ParmDefinition, @retIndexOUT=@retIndex OUTPUT, @retTextOUT=@retText OUTPUT;возвращаемые значения находятся в @retIndex и @retText
возвращаемые значения обычно используются не для" возврата " результата, а для возврата успеха (0) или номера ошибки (1-65K). Все вышесказанное, по-видимому, указывает на то, что sp_executesql не возвращает значение, которое неверно. sp_executesql возвращает 0 для успешного выполнения и любое другое число для сбоя.
в Ниже, @я вернусь 2727
DECLARE @s NVARCHAR(500) DECLARE @i INT; SET @s = 'USE [Blah]; UPDATE STATISTICS [dbo].[TableName] [NonExistantStatisticsName];'; EXEC @i = sys.sp_executesql @s SELECT @i AS 'Blah'SSMS покажет это Msg 2727, Уровень 11, Состояние 1, Строка 1 Не удается найти индекс 'NonExistantStaticsName'.
объявить @ ValueTable таблица ( Значение VARCHAR (100) )
SELECT @sql = N'SELECT SRS_SizeSetDetails.'+@COLUMN_NAME+' FROM SRS_SizeSetDetails WHERE FSizeID = '''+@FSizeID+''' AND SRS_SizeSetID = '''+@SRS_SizeSetID+''''; INSERT INTO @ValueTable EXEC sp_executesql @sql; SET @Value=''; SET @Value = (SELECT TOP 1 Value FROM @ValueTable) DELETE FROM @ValueTable
Это было давно, поэтому не уверен, что это все еще необходимо, но вы можете использовать переменную @@ROWCOUNT, чтобы увидеть, сколько строк было затронуто предыдущим оператором sql.
Это полезно, когда, например, вы создаете динамический оператор обновления и запускаете его с помощью exec. @@ROWCOUNT покажет, сколько строк было обновлено.
Comments