Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > динамический запрос + возврат данных


Автор: Wanderer2019 13.11.2007, 09:56
Привет!
Подскажите как решить 2 проблеммы связанные с хранимой процедурой:
1. Динамически подставлять название сервера и БД в запрос.
2. Возвращать 2 параметра из этой процедуры.

По п.1 решением может быть составление теката запроса в формата (например) varchar и далее вызов запроса при помощи EXEC(x).
Но вот п.2 никак решить не получается... если пишу, что в нем присвоение данных каким то переменным (в тексте), то при вызове он пишет, что необходимо объявить переменные, хотя они конечно же объявлены.


Автор: AlexxxM 13.11.2007, 10:23
Да была такая проблема, в динамическом запросе MSSQL не видит внешние переменные.

Решили с помощью временных таблиц, перед выполнением динамического запроса создаем временную таблицу (ее в динамическом запросе видно), записываем нужные данные во временную таблицу, а после выполнения динамического запроса извлекаем данные из временной таблицы

Автор: Wanderer2019 13.11.2007, 10:44
Цитата(AlexxxM @  13.11.2007,  10:23 Найти цитируемый пост)
создаем временную таблицу

В сиквеле есть какие то спец операторы для этого? или просто Create TABLE/DROP TABLE?

Автор: Servena 13.11.2007, 10:46
А пример можно?

Автор: AlexxxM 13.11.2007, 10:56
Код

CREATE TABLE #TempTable (s Varchar(10))

EXEC('INSERT INTO #TempTable(s)
           SELECT Column1 FROM OtherTable WHERE ...')

SELECT s FROM #TempTable


Что-то вроде такого.
Временные таблицы создаются также как и обычные таблицы, перед именем таблицы ставится символ #, он и указывает серверу что это временная таблица. DROP TABLE можно не делать, таблица сама уничтожиться по окончании сторед процедуры. Вообще это и в helpе вполне понятно описано.

Автор: VOS 13.11.2007, 15:07
Через таблицы можно если Вам надо получить набор данных. Если только пару значений, то лучше так:

Код

DECLARE @SQLString nVARCHAR(500)
DECLARE @Param nVARCHAR(500)
--in параметр
declare @orderid int 
--out параметр 
declare @cnt  int      

SET @SQLString = N'SELECT @cnt=count(*) FROM northwind.dbo.orders WHERE orderid = @orderid'
--указать что за параметры, тип и in/out
SET @Param = N'@cnt int out,@orderid int'

--можно так инициализировать, или см. ниже
--set @orderid= 10248

EXECUTE sp_executesql @SQLString, @Param,
                      @cnt out, @orderid =10248 

--проверить
select @cnt

Автор: Todd 16.1.2008, 18:53
А если динамический запрос должен возвратить xml? 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)