Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 EXEC (TSQL-script) и переменные  [new]
Королёв Константин
Guest
Привет все!
Почему этот скрипт выдает ошибку
и всегда возвращает 1?
Как заставить его возвратить 0?
set или select - не важно...
--------------
declare @r integer
set @r=1
exec ('set @r = 0')
print (@r)
---
Списобо всем, кто откликнулся.
Konstantin, kos@tns.com.ua
30 май 01, 15:24    [7606]     Ответить | Цитировать Сообщить модератору
 RE:EXEC (TSQL-script) и переменные  [new]
andy
Guest
Не знаю поможет или нет, т.к. не понимаю для чего нужно делать именно так. Но следующее работает

create procedure #a @param1 int OUTPUT as
begin
select @param1=0
end

declare @r integer
set @r=1
exec #a @r OUTPUT
print (@r)

В принципе можно собрать строку, которая будет создавать такую временную процедуру, исполнять ее, а затем также.

declare @s as nvarchar(500)
SET @s=N'create procedure #a @param1 int OUTPUT as begin select @param1=0 end'
EXEC (@s)

declare @r integer
set @r=1
exec #a @r OUTPUT
print (@r)

А пример не работает потому, что EXEC выполняет переданную ему строку в другом контексте.
30 май 01, 16:37    [7607]     Ответить | Цитировать Сообщить модератору
 RE:EXEC (TSQL-script) и переменные  [new]
Fompro
Member

Откуда:
Сообщений: 363
А почему бы не так?
exec ('declare @r int set set @r=0 PRINT @r')
30 май 01, 19:22    [7608]     Ответить | Цитировать Сообщить модератору
 RE:EXEC (TSQL-script) и переменные  [new]
Королёв+Константин
Guest
Присланный мной пример - только пример. Исходная задача такая:
создается (динамически по некоторому принципу) 1-30 таблиц
с именами Табл1-Табл30. В каждой из них есть общие колонки:
rowid integer, str varchar(разной длины).
Чтобы не писать для каждой такой таблицы свою процедуру,
которая делает одни и те же действия, хочется написать ЕДИНУЮ процедуру:
--------------
CREATE procedure [_get_rowid] ( @table varchar (50), @string varchar (255))
AS
declare @rowid integer select @rowid = 0
exec ('select @rowid=max(rowid) from '+@table+' where str like '''+@string''')
return @rowid
--------------
Вот здесь и возникают проблемы.
30 май 01, 21:47    [7609]     Ответить | Цитировать Сообщить модератору
 RE:EXEC (TSQL-script) и переменные  [new]
Slava
Member

Откуда: Сибирь, Новосибирск
Сообщений: 794
А Вы попробуйте в конструкции EXEC данные во временную таблицу запихать, а потом
SELECT @rowid = Field FROM #Tmp
А вообще вроде лучше функцию сделать вместо процедуры
31 май 01, 02:35    [7610]     Ответить | Цитировать Сообщить модератору
 RE:EXEC (TSQL-script) и переменные  [new]
SergSuper
Guest
2 Королёв Константин

1. Если Вам так нравиться динамически делать запросы, то см. sp_executesql. Но предупреждаю сразу - на мой взгляд это "путь в никуда"

2. Что бы я предложил:
Сделать один раз такой вид:
create view tblAll as
select 'tbl1' name, rowid, str from tbl1
union
select 'tbl2' name, rowid, str from tbl2
...
union
select 'tbl30' name, rowid, str from tbl30

И дальше всё просто:
CREATE procedure _get_rowid @table varchar (50), @string varchar (255)
AS
declare @rowid integer select @rowid = 0
select @rowid=max(rowid) from tblAll where str like @string and name=@table
return @rowid

Можно даже тогда функцию сделать.
31 май 01, 06:17    [7611]     Ответить | Цитировать Сообщить модератору
 RE:EXEC (TSQL-script) и переменные  [new]
Королёв+Константин
Guest
1. есть ли какое нибудь решение этой задачи,
не требующее создания чего-либо временного (процедуры/таблицы/view)?
или это ПРИНЦИПИАЛЬНО не возможно? если не возможно, то почему?

2. что такое procedure понятно, но что такое "функция"?
каков ее SQL-синтаксис? или имеется ввиду ActiveX?

Спасибо.
31 май 01, 13:45    [7612]     Ответить | Цитировать Сообщить модератору
 RE:EXEC (TSQL-script) и переменные  [new]
DmtP
Guest
Вставь Declare @r внутрь EXECа.
31 май 01, 13:48    [7613]     Ответить | Цитировать Сообщить модератору
 RE:EXEC (TSQL-script) и переменные  [new]
SergSuper
Guest
2 Королёв+Константин

1. Решение есть. Но писать его не буду. Потому что, повторюсь, это тупиковый путь.

2. Функции или UDF - есть только в SQL2000. Ничего общего с ActiveX не имеют.
1 июн 01, 05:34    [7614]     Ответить | Цитировать Сообщить модератору
 RE:EXEC (TSQL-script) и переменные  [new]
Vladimir
Guest
To SergSuper :
Добрый день!
А можно разъяснить в чем тупиковость путя ?
8 июн 01, 08:06    [7615]     Ответить | Цитировать Сообщить модератору
 RE:EXEC (TSQL-script) и переменные  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
2Vladimir


"Этапы большого пути" или "Путь в никуда"

1.
select max(rowid) from tbl where str like 'string'

2.
exec('select max(rowid) from tbl where str like '"string"')

3.
exec ('select max(rowid) from '+@table+' where str like '''+@string''')

4.
create table #t(id int, item varchar(99))
insert #t select 1,'max'
insert #t select 2,'rowid'
insert #t select 3,'tbl'
insert #t select 4,'str'
insert #t select 5,'like'
insert #t select 6,'string'
declare @s varchar(99)
select @s='select '+t1.item+'('+t2.item+') from '+t3.item+' where '+t4.item+' '+t5.item+' '''+t6.item+''''
from #t t1,#t t2,#t t3,#t t4,#t t5,#t t6
where t1.id=1 and t2.id=2 and t3.id=3 and t4.id=4 and t5.id=5 and t6.id=6
exec(@s)

5.
Можете сами продолжить


Вообще-то не так давно я высказывадся на эту тему, не хочется повторяться.
Ну это моё личное мнение, оно может быть и неправильным, можете его воспринимать, а можете не воспринимать.
8 июн 01, 08:56    [7616]     Ответить | Цитировать Сообщить модератору
 RE:EXEC (TSQL-script) и переменные  [new]
Serge+S.+Fakas
Guest
Ну я такую задачку (динамическое создание таблиц разной структуры) сделал используя словарь. В нем описаны все поля таблицы, а процедура создания просто пробегает по ним, формирует SQL строку вида CREATE TABLE и выполняет ее. Получилось оч. даже симпатично .
8 июн 01, 15:03    [7617]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: EXEC (TSQL-script) и переменные  [new]
FVadimir
Guest
Королёв Константин, почитайте http://www.sommarskog.se/dynamic_sql.html
Немного поздновато, но может кому ещё пригодится
DECLARE @tbl sysname,
@sql nvarchar(4000),
@params nvarchar(4000),
@count int

DECLARE tblcur CURSOR STATIC LOCAL FOR
SELECT object_name(id) FROM syscolumns WHERE name = 'LastUpdated'
ORDER BY 1
OPEN tblcur

WHILE 1 = 1
BEGIN
FETCH tblcur INTO @tbl
IF @@fetch_status <> 0
BREAK

SELECT @sql =
N' SELECT @cnt = COUNT(*) FROM dbo.' + quotename(@tbl) +
N' WHERE LastUpdated BETWEEN @fromdate AND ' +
N' coalesce(@todate, ''99991231'')'
SELECT @params = N'@fromdate datetime, ' +
N'@todate datetime = NULL, ' +
N'@cnt int OUTPUT'
EXEC sp_executesql @sql, @params, '20060101', @cnt = @count OUTPUT


PRINT @tbl + ': ' + convert(varchar(10), @count) + ' modified rows.'
END

DEALLOCATE tblcur
8 авг 17, 20:11    [20709396]     Ответить | Цитировать Сообщить модератору
 Re: EXEC (TSQL-script) и переменные  [new]
Remind
Member

Откуда: UK
Сообщений: 523
FVadimir
Немного поздновато

Самую малость.
8 авг 17, 20:54    [20709461]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить