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

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

declare @count_int int
declare @serv varchar (256)
declare @SQL_Query1 varchar (256)
set @serv = 'master.dbo.sysusers'
set @SQL_Query1 = 'select COUNT(*) from ' + @serv + ' where name = ''dbo'''
EXEC(@SQL_Query1)

Вопрос в том, как присвоить переменной @count_int значение EXEC(@SQL_Query1)
Если писать:
set @count_int = EXEC(@SQL_Query1)
Возвращает ошибку:
Incorrect syntax near the keyword 'EXEC'.

Как быть?

https://www.sql.ru/faq/faq_topic.aspx?fid=104
https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=716783
читал, не поомогло ...
3 дек 09, 10:16    [8012119]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить переменной выполненной функции.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> https://www.sql.ru/faq/faq_topic.aspx?fid=104
> https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=716783
> читал, не поомогло ...


В данном примере в динамический запрос передаются 4 переменные, три из которых являюся выходными


declare @var1 int, @var2 varchar(100), @var3 varchar(100), @var4 int
declare @mysql nvarchar(4000)
set @mysql = 'set @var1 = @var1 + @var4; set @var2 = ''CCCC''; set @var3 = @var3 + ''dddd'''
set @var1 = 0
set @var2 = 'BBBB'
set @var3 = 'AAAA'
set @var4 = 10

select @var1, @var2, @var3
exec sp_executesql @mysql, N'@var1 int out, @var2 varchar(100) out, @var3 varchar(100) out, @var4 int',
@var1 = @var1 out, @var2 = @var2 out, @var3 = @var3 out, @var4 = @var4
select @var1, @var2, @var3


по буквам давайте - что конкретно в этом примере не понятно?

Posted via ActualForum NNTP Server 1.4

3 дек 09, 10:19    [8012135]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить переменной выполненной функции.  [new]
missing.fox
Member

Откуда:
Сообщений: 264
declare @count_int int
declare @serv varchar (256)
DECLARE @SQL_Query1 varchar (256)

set @serv = 'master.dbo.sysusers'
set @SQL_Query1 = 'select COUNT(*) from ' + @serv + ' where name = ''dbo'''
exec sp_executesql @SQL_Query1, N'@SQL_Query1 varchar (256) out',
@SQL_Query1 = @SQL_Query1

не работает, вот ошибка ....
Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.
3 дек 09, 10:55    [8012375]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить переменной выполненной функции.  [new]
PokeMan
Member

Откуда: MOSKAU
Сообщений: 312
declare @count_int int
declare @serv nvarchar (256)
DECLARE @SQL_Query1 nvarchar (256)

set @serv = N'master.dbo.sysusers'
set @SQL_Query1 = N'select COUNT(*) from ' + @serv + ' where name = ''dbo'''
exec sp_executesql @SQL_Query1, N'@SQL_Query1 varchar (256) output',
@SQL_Query1 = @SQL_Query1 output
Этого хотели?
3 дек 09, 11:00    [8012427]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить переменной выполненной функции.  [new]
PokeMan
Member

Откуда: MOSKAU
Сообщений: 312
Сорри не проснулся еще :-)

declare @count_int int
declare @serv nvarchar (256)
DECLARE @SQL_Query1 nvarchar (256)

set @serv = N'master.dbo.sysusers'
set @SQL_Query1 = N'select @count_int = COUNT(*) from ' + @serv + ' where name = ''dbo'''
exec sp_executesql @SQL_Query1, N'@SQL_Query1 varchar (256), @count_int int output',
@SQL_Query1 = @SQL_Query1,
@count_int = @count_int output
print @count_int
3 дек 09, 11:03    [8012447]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить переменной выполненной функции.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> не работает, вот ошибка ....
> Procedure expects parameter '@statement' of type 'ntext/nchar/nvarchar'.

@SQL_Query1 должен быть именно Nvarchar. обязательно.

Posted via ActualForum NNTP Server 1.4

3 дек 09, 11:09    [8012513]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить переменной выполненной функции.  [new]
missing.fox
Member

Откуда:
Сообщений: 264
Не совсем ...
Надо, чтобы переменной @count_int было присвоено значение 1
То есть значение @SQL_Query1
3 дек 09, 11:11    [8012527]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить переменной выполненной функции.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Не совсем ...
> Надо, чтобы переменной @count_int было присвоено значение 1
> То есть значение @SQL_Query1

ля!
давайте по шагам.
как бы вы решали эту задачу, если бы запрос был статическим, а не динамическим?

Posted via ActualForum NNTP Server 1.4

3 дек 09, 11:15    [8012554]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить переменной выполненной функции.  [new]
missing.fox
Member

Откуда:
Сообщений: 264
declare @count_int int
set @count_int = (select COUNT(*) from master.dbo.sysusers where name = 'dbo')
print @count_int
3 дек 09, 11:23    [8012623]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить переменной выполненной функции.  [new]
PokeMan
Member

Откуда: MOSKAU
Сообщений: 312
чьёрт ... сорри не проснулся совсем :-)))


declare @count_int int
declare @serv nvarchar (256)
DECLARE @SQL_Query1 nvarchar (256)

set @serv = N'master.dbo.sysusers'
set @SQL_Query1 = N'select @count_int = COUNT(*) from ' + @serv + ' where name = ''dbo'''
exec sp_executesql @SQL_Query1, N'@count_int int output',
@count_int = @count_int output
print @count_int
...
ТО ТП: А я чего написал ... :-)

Читайте внимательней BOL и будет вам счастье.

тут все красиво, даже примерчики есть
3 дек 09, 11:28    [8012701]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить переменной выполненной функции.  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

ок.
вот этот _текст запроса_

> set @count_int = (select COUNT(*) from master.dbo.sysusers where name =
> 'dbo')

должен быть в переменной @SQL_Query1.

для получения результата надо:
а. объявить во внешнем скрипте переменную @count_int int
б. во втором параметре процедуры sp_executesql объявить
выходной параметр @count_int int out
б. составить текст запроса, в котором нужное значение будет присваиваться
выходному параметру @count_int
в. третьим параметром передать в процедуру sp_executesql объявленную
переменную @count_int (не забыть указать ключевое слово out)


Posted via ActualForum NNTP Server 1.4

3 дек 09, 11:32    [8012741]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить переменной выполненной функции.  [new]
missing.fox
Member

Откуда:
Сообщений: 264
Спасибо!!!
Обязательно прочту, сразу же.
Скоро будет готов большой скрипт по миграции пользователей с SQL2000 на SQL2008.
Обязательно выложу, для всех )))
3 дек 09, 11:34    [8012758]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить переменной выполненной функции.  [new]
missing.fox
Member

Откуда:
Сообщений: 264
На самом деле был вариант, но он пишет в Messages -> (1 row(s) affected), это меня категорически не устраивало, вот, как я это реализовал:

declare @count_int int
declare @serv varchar (256)
DECLARE @SQL_Query1 varchar (256)
set @serv = 'master.dbo.sysusers'
set @SQL_Query1 = 'select COUNT(*) from ' + @serv + ' where name = ''dbt'''
CREATE TABLE CompareResultSet (CompareCount int)
INSERT INTO CompareResultSet EXEC(@SQL_Query1)
select @count_int = max(CompareCount) from CompareResultSet
print @SQL_Query1
print @count_int
drop table CompareResultSet
3 дек 09, 11:51    [8012927]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить переменной выполненной функции.  [new]
Glory
Member

Откуда:
Сообщений: 104760
missing.fox
На самом деле был вариант, но он пишет в Messages -> (1 row(s) affected), это меня категорически не устраивало, вот, как я это реализовал:

declare @count_int int
declare @serv varchar (256)
DECLARE @SQL_Query1 varchar (256)
set @serv = 'master.dbo.sysusers'
set @SQL_Query1 = 'select COUNT(*) from ' + @serv + ' where name = ''dbt'''
CREATE TABLE CompareResultSet (CompareCount int)
INSERT INTO CompareResultSet EXEC(@SQL_Query1)
select @count_int = max(CompareCount) from CompareResultSet
print @SQL_Query1
print @count_int
drop table CompareResultSet

Так это вариант все равно пишет (1 row(s) affected) в Messages
3 дек 09, 11:58    [8012994]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить переменной выполненной функции.  [new]
missing.fox
Member

Откуда:
Сообщений: 264
вот именно, который представил я, через таблицу, пишет, а тот, что вы мне предложили не пишет в (1 row(s) affected) в Messages, только значение возвращает, да и то тпо команде PRINT
3 дек 09, 12:14    [8013140]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить переменной выполненной функции.  [new]
Glory
Member

Откуда:
Сообщений: 104760
missing.fox
вот именно, который представил я, через таблицу, пишет, а тот, что вы мне предложили не пишет в (1 row(s) affected) в Messages, только значение возвращает, да и то тпо команде PRINT

Вы бы разобрались сначала с тем, что хотите получать.
А то у вас сначала "присвоить переменной значение", а потом вдруг "писать/не писать" куда-то какие-то служебные сообщения
3 дек 09, 12:25    [8013249]     Ответить | Цитировать Сообщить модератору
 Re: Как присвоить переменной выполненной функции.  [new]
missing.fox
Member

Откуда:
Сообщений: 264
Да, дейтсвительно, тоже возвращает ...
А есть спомоб, отменить возвращение мессаджа при исполнении скрипта?
3 дек 09, 12:26    [8013257]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить