Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Королёв Константин
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] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Fompro Member Откуда: Сообщений: 363 |
А почему бы не так? exec ('declare @r int set set @r=0 PRINT @r') ![]() |
30 май 01, 19:22 [7608] Ответить | Цитировать Сообщить модератору |
Королёв+Константин
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] Ответить | Цитировать Сообщить модератору |
Slava Member Откуда: Сибирь, Новосибирск Сообщений: 794 |
А Вы попробуйте в конструкции EXEC данные во временную таблицу запихать, а потом SELECT @rowid = Field FROM #Tmp А вообще вроде лучше функцию сделать вместо процедуры |
31 май 01, 02:35 [7610] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Королёв+Константин
Guest |
1. есть ли какое нибудь решение этой задачи, не требующее создания чего-либо временного (процедуры/таблицы/view)? или это ПРИНЦИПИАЛЬНО не возможно? если не возможно, то почему? 2. что такое procedure понятно, но что такое "функция"? каков ее SQL-синтаксис? или имеется ввиду ActiveX? Спасибо. |
31 май 01, 13:45 [7612] Ответить | Цитировать Сообщить модератору |
DmtP
Guest |
Вставь Declare @r внутрь EXECа. |
31 май 01, 13:48 [7613] Ответить | Цитировать Сообщить модератору |
SergSuper
Guest |
2 Королёв+Константин 1. Решение есть. Но писать его не буду. Потому что, повторюсь, это тупиковый путь. 2. Функции или UDF - есть только в SQL2000. Ничего общего с ActiveX не имеют. |
1 июн 01, 05:34 [7614] Ответить | Цитировать Сообщить модератору |
Vladimir
Guest |
To SergSuper : Добрый день! А можно разъяснить в чем тупиковость путя ? |
8 июн 01, 08:06 [7615] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Serge+S.+Fakas
Guest |
Ну я такую задачку (динамическое создание таблиц разной структуры) сделал используя словарь. В нем описаны все поля таблицы, а процедура создания просто пробегает по ним, формирует SQL строку вида CREATE TABLE и выполняет ее. Получилось оч. даже симпатично ![]() |
8 июн 01, 15:03 [7617] Ответить | Цитировать Сообщить модератору |
Между сообщениями интервал более 1 года. |
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] Ответить | Цитировать Сообщить модератору |
Remind Member Откуда: UK Сообщений: 523 |
Самую малость. |
||
8 авг 17, 20:54 [20709461] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |