Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Подстановка  [new]
Break Point
Member

Откуда:
Сообщений: 68
Есть пременная @iCount. Необходимо в данную переменную записать результат следующего запроса.

@cExec = 'SELECT COUNT(' + @cField + ') FROM ' + @cTable

EXEC (@cExec)


Возможно ли это? И как?
Спасибо.
20 мар 03, 09:08    [151960]     Ответить | Цитировать Сообщить модератору
 Re: Подстановка  [new]
NNN
Member

Откуда:
Сообщений: 2141
Кажись так

declare @cExec nvarchar(1028)
...
set @cExec = 'SELECT COUNT(' + @cField + ') FROM ' + @cTable
EXEC sp_executesql @cExec
20 мар 03, 09:14    [151967]     Ответить | Цитировать Сообщить модератору
 Re: Подстановка  [new]
gringo
Member

Откуда: Nizny Novgorod
Сообщений: 76
Можно и так
@cExec = 'SELECT COUNT(' + @cField + ') FROM ' + @cTable
exec (@cExec)
Set @iCount = @@RowCount
20 мар 03, 09:20    [151978]     Ответить | Цитировать Сообщить модератору
 Re: Подстановка  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
Вообще-то невозможно - разве что использовать

declare @cExec nvarchar(1028)
declare @iCount int
set @cExec = 'SELECT @iCount = COUNT(' + @cField + ') FROM ' + @cTable
...
EXEC sp_executesql @cExec, N'@cField varchar(???), @iCount int', @iCount output

PRINT @iCount

НО использование sp_executesql для получения выходных параметров(output) это недокументированная возможность
20 мар 03, 10:05    [152033]     Ответить | Цитировать Сообщить модератору
 Re: Подстановка  [new]
Break Point
Member

Откуда:
Сообщений: 68
ТО есть результат динамического запроса поместить в переменную невозможно, кроме как использовать недокументированные возможности, кои могут быть закрыты следующим сервис паком? Так?
Это очень плохо.
20 мар 03, 13:40    [152393]     Ответить | Цитировать Сообщить модератору
 Re: Подстановка  [new]
Break Point
Member

Откуда:
Сообщений: 68
В общем проблема выросла вот из чего. Необходимо внутри некоторой процедуры выполнить ветвеление, на основе результата запроса, например:

SELECT SUM(FieldName) FROM TableNAme


IF [сумма из запроса] > 333
...
набор команд (нереализуемых одним запросом)
...
ELSE
...
набор команд (нереализуемых одним запросом)
...


причем имя поля и таблицы - параметры процедуры.
КАК ЭТО РЕАЛИЗОВАТЬ???
20 мар 03, 15:15    [152584]     Ответить | Цитировать Сообщить модератору
 Re: Подстановка  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
хоть funikovyuri говорит что это не документированно а используют все...
на самом деле проца создает временную хранимую процедуру.....

sp_executesql [@stmt =] stmt, -- первый параметр - будет телом процедуры

[ {, [@params =] N'@parameter_name data_type [,...n]' } -- входные параметры ( можно даже default использовать...8) )

{, [@param1 =] 'value1' [,...n] } -- а это присваевание входным параметрам значения при вызове

]

т.е. этот код
declare @cExec nvarchar(1028)

declare @iCount int
set @cExec = 'SELECT @iC = COUNT(' + @cField + ') FROM ' + @cTable
EXEC sp_executesql @cExec, N'@iC int output', @iC = @iCount output
PRINT @iCount

равнозначен вот этому....
declare @cExec nvarchar(1028),@iCount int

set @cExec = 'SELECT @iC = COUNT(' + @cField + ') FROM ' + @cTable
EXEC ('create proc #p ' + N'@iC int output' + ' as begin '+ @cExec + ' end')
EXEC #p @iC=@iCount output
PRINT @iCount

-----------------------------------------------------------
если вам нужен документированный способ - то можно так
declare @cExec nvarchar(1028)

create table #t (cnt int)
set @cExec = INSERT #t SELECT COUNT(' + @cField + ') as cnt FROM ' + @cTable
EXEC (@cExec)
SET @iCount= select cnt from #t PRINT @iCount
20 мар 03, 18:03    [152869]     Ответить | Цитировать Сообщить модератору
 Re: Подстановка  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
declare @cExec nvarchar(1028)

create table #t (cnt int)
set @cExec = 'INSERT #t SELECT COUNT(' + @cField + ') as cnt FROM ' + @cTable
EXEC (@cExec)
SET @iCount= select cnt from #t PRINT @iCount
20 мар 03, 18:07    [152874]     Ответить | Цитировать Сообщить модератору
 Re: Подстановка  [new]
Andrew Volkov
Member

Откуда: My little world
Сообщений: 103
Ниче толком до конца не понял.
Не разъяснит ли кто-нибудь откуда берется
@cField 

@cTable

и вот это что?
N'@iC int output'


Если не сложно в двух словах...
20 мар 03, 18:14    [152880]     Ответить | Цитировать Сообщить модератору
 Re: Подстановка  [new]
MiCe
Member

Откуда: RUSSIA STAVROPOL Pyatigorsk
Сообщений: 1996
create proc u_sp_myCount

@cField varchar(250), -- поле которое считаем

@cTable varchar(250), -- поле которое считаем

@cWhere varchar(500), -- filtr

@iCount int OUTPUT -- переменная куда вернется count

as
BEGIN
declare @cExec nvarchar(1028),
set @cExec = 'SELECT @iC = COUNT(' + @cField + ') FROM ' +
@cTable+ ' ' + @cWhere
print @cExec
print '@iC -- переменная внутри stmt'

EXEC sp_executesql @cExec,
N'@iC int output', -- объявляем @iC для @cExec с параметром OUTPUT

@iC = @iCount output -- @iCount - на выходе примет значение @iC

PRINT @iCount
END
20 мар 03, 19:10    [152938]     Ответить | Цитировать Сообщить модератору
 Re: Подстановка  [new]
Break Point
Member

Откуда:
Сообщений: 68
2 MiCe
ОГРОМНОЕ спосибо. ---> То что нужно. С чувством, столком с расстановкой!
21 мар 03, 11:29    [153288]     Ответить | Цитировать Сообщить модератору
 Re: Подстановка  [new]
Break Point
Member

Откуда:
Сообщений: 68
В догонку.
Теперь на основе только что решенной проблемы выросла новая :))

Была функция определяющая полное наименование узла дерева. НО имена полей в селекте да и сама таблица были жестко прописаны. Теперь решил переделать на вышесказанный лад и выясняется что внутри функции я не могу ни выполнить sp_executesql, ни создать временную таблицу.

Итак вопрос. :)) Нужно выполнить нечто вроде
SELECT SomeField, FullPath = [dbo].MyFunc(Node, 'idc', 'prnt', 'names', 'TreeTable') FROM TreeTable

Возможно ли это как-то реализовать или необходимо писать хранимую процедуру и делать с ней объединение по Node. (что как мне кажется коряво).
21 мар 03, 14:49    [153579]     Ответить | Цитировать Сообщить модератору
 Re: Подстановка  [new]
Andrew Volkov
Member

Откуда: My little world
Сообщений: 103
N'@iC int output',


а ЧТО подразумевается под этой записью???
21 мар 03, 15:18    [153637]     Ответить | Цитировать Сообщить модератору
 Re: Подстановка  [new]
Break Point
Member

Откуда:
Сообщений: 68
2 Andrew Volkov
Подразумевается объявление параметра для запроса в @cExec
21 мар 03, 15:36    [153679]     Ответить | Цитировать Сообщить модератору
 Re: Подстановка  [new]
Andrew Volkov
Member

Откуда: My little world
Сообщений: 103
В смысле сам синтаксис не понятен

Не видел раньше такой записи

N'fvdfbg'
21 мар 03, 16:00    [153715]     Ответить | Цитировать Сообщить модератору
 Re: Подстановка  [new]
Break Point
Member

Откуда:
Сообщений: 68
Была функция определяющая полное наименование узла дерева. НО имена полей в селекте да и сама таблица были жестко прописаны. Теперь решил переделать на вышесказанный лад и выясняется что внутри функции я не могу ни выполнить sp_executesql, ни создать временную таблицу.

Итак вопрос. :)) Нужно выполнить нечто вроде
SELECT SomeField, FullPath = [dbo].MyFunc(Node, 'idc', 'prnt', 'names', 'TreeTable') FROM TreeTable

Возможно ли это как-то реализовать или необходимо писать хранимую процедуру и делать с ней объединение по Node. (что как мне кажется коряво).
24 мар 03, 10:15    [154506]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить