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

Откуда:
Сообщений: 5
Есть такая проблема. В блоб поле(тип ntext храниться SQL скрипт..)
попрошу обратить внимание что скрипт, а не запрос.
Нужно его выполнить. Для этого написал такой скрипт

declare @@SQL_Block binary(16)
declare @@BLOB_SIZE int

SELECT @@SQL_Block = TEXTPTR(SQL_Block) , @@BLOB_SIZE = DATALENGTH(SQL_Block) /2
FROM dbo.device_cycle_controll a
where a.id = @@cycle_id

READTEXT device_cycle_controll.SQL_Block @@SQL_Block 0 @@BLOB_SIZE

---Именно здесь не понятно как передать параметр Ntext.. И как впендюрить READTEXT в параметр Sp_executesql

exec sp_executesql @@SQL_Block
17 июн 09, 11:18    [7308948]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql с параметром ntext  [new]
Crimean
Member

Откуда:
Сообщений: 13148


ну вот, еще один попался на это ограничение. с сервер-сайда - никак. нельзя декларить BLOB переменные в T-SQL. можно только как параметрами оперировать. лично я выкрутился достаточно просто - нарисовал DLL, которую можно "кормить" кусками команды, она их "клеит", а потом просишь DLL это выполнить. потому как вернуть из DLL склеенное тош не получится
но у меня эта DLL уже была для специфичных задач, просто +1 функцию прикрутил
решить можно, конечно же, на CLR. но все равно надо будет делать внешнее подключение к серверу и в нем выполнять команду.
кстати! я бы попробовал varchar(max) для этой цели. может подойдет, если сервер не 2000, конечно же
17 июн 09, 11:23    [7308992]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql с параметром ntext  [new]
Штольц
Member

Откуда:
Сообщений: 5
Crimean,

В том то и трагедия, что это именно SQL2000 :-)
я уже попробовал решение через xp_execresultset
но он собака не понимает скриптов, только простой запрос может исполнять
17 июн 09, 11:26    [7309023]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql с параметром ntext  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Если версия>=90, то помещаете скрипт в NVARCHAR(MAX) -> проблема решена.
Если версия<90, то почему обязательно sp_executesql?
Чем EXEC() не устраивает?
Объявляете сколько надо переменных типа NVARCHAR(4000),
запихиваете в них куски кода из NTEXT, а потом -
EXEC(@SQL1+@SQL2+...)
И опять проблема решена!
17 июн 09, 11:30    [7309049]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql с параметром ntext  [new]
Glory
Member

Откуда:
Сообщений: 104760
Штольц
Crimean,

В том то и трагедия, что это именно SQL2000 :-)
я уже попробовал решение через xp_execresultset
но он собака не понимает скриптов, только простой запрос может исполнять

И в чем это выражается ? Не в наличии ли в вашем скрипте GO ?
17 июн 09, 11:31    [7309057]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql с параметром ntext  [new]
Штольц
Member

Откуда:
Сообщений: 5
Glory,

declare @@SQL_ques Nvarchar(4000)
SET @@SQL_ques = N' declare @@id int set @@id = 1 set @@id = @@id+1 select @@id'


EXEC master..xp_execresultset @@SQL_ques, N'device'

Вот пример.. и вываливает ошибка, хотя должно вернуть 2.. что и делает sp_executesql
17 июн 09, 11:40    [7309139]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql с параметром ntext  [new]
Штольц
Member

Откуда:
Сообщений: 5
iap,

А я не могу сказать сколько их нужно.. вдруг нужно 100 штук..
хотя может я так и сделаю.. в принципе думал так делать, но смутило что sp_executesql Имеет в качестве параметра ntext.. а нафиг? если его нельзя подставить
17 июн 09, 11:43    [7309167]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql с параметром ntext  [new]
Crimean
Member

Откуда:
Сообщений: 13148
подставить-то как раз можно. если то, что подставляешь - параметр твоей хранимки типо замкнутый круг для 2000. то есть с клиента - с блобами работать скока хошь. с сервера - фигу
17 июн 09, 11:52    [7309242]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql с параметром ntext  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Штольц
iap,

А я не могу сказать сколько их нужно.. вдруг нужно 100 штук..
Внутри @SQL оператора EXEC(@SQL) может быть, в свою очередь, EXEC(), внутри строки которого - другие EXEC() и т.д.
Внутренний EXEC() вполне может сформировать и выполнить скрипт с объявлением какого угодно количества переменных (их имена, конечно, придётся генерировать)

Сумбурно излагаю как-то...
17 июн 09, 11:58    [7309282]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql с параметром ntext  [new]
Crimean
Member

Откуда:
Сообщений: 13148
2 iap

понятно. но делать такое - крайне мутно, а сопровождать не проще, чем чужие регулярные выражения
17 июн 09, 12:10    [7309394]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql с параметром ntext  [new]
Штольц
Member

Откуда:
Сообщений: 5
iap,

Насколько я помню видимости 'внешних' переменных в таком запросе не будет
т.е. если в головной процедуре объявлена переменная @@id
то её нельзя будет увидеть.. сам проверял. Это как бы Пакет в терминологии SQL
по крайней мере на SQL 2000 точно
17 июн 09, 12:49    [7309737]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql с параметром ntext  [new]
Crimean
Member

Откуда:
Сообщений: 13148
2 Штольц

не, там чуть другая идея :)

генерить динамически скрипт в котором будет задекларено нужное число переменных
в которые будет вычитано нужное число кусков text поля
а потом это все будет выполнено как exec( @s1 + @s2 + ... )
динамически - потому как заранее неизвестно, сколько переменных надо
17 июн 09, 13:17    [7309999]     Ответить | Цитировать Сообщить модератору
 Re: sp_executesql с параметром ntext  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Штольц
iap,

Насколько я помню видимости 'внешних' переменных в таком запросе не будет
т.е. если в головной процедуре объявлена переменная @@id
то её нельзя будет увидеть.. сам проверял. Это как бы Пакет в терминологии SQL
по крайней мере на SQL 2000 точно
Представьте себе скрипт
DECLARE @SQL1 NVARCHAR(4000);
SET @SQL1=N'USE tempdb';
DECLARE @SQL2 NVARCHAR(4000);
SET @SQL2=N'CREATE TABLE #T';
DECLARE @SQL3 NVARCHAR(4000);
SET @SQL3=N'(ID int NOT NULL, X INT);';
DECLARE @SQL4 NVARCHAR(4000);
SET @SQL4=N'INSERT #T(ID,X)';
DECLARE @SQL5 NVARCHAR(4000);
SET @SQL5=N'SELECT object_id,parent_object_id FROM sys.objects;';
EXEC(@SQL1+@SQL2+@SQL3+@SQL4+@SQL5);
Всё корректно, правда?
А если этот скрипт получился в результате выполнения другого скрипта с помощью EXEC()?
Например, в этом "внешнем" скрипте имеется цикл по курсору какому-нибудь.
При каждом проходе цикла к одной строке прибавляем
N'DECLARE @SQL'+CAST(@I AS NVARCHAR)+N' NVARCHAR(4000); SET @SQL'+CAST(@I AS NVARCHAR)+N'=..........'
, а к другой, начинающейся с N'EXEC(', -
N'+@SQL'+CAST(@I AS NVARCHAR)
После цикла стоит EXEC(ПерваяСтрока+ВтораяСтрока).
Получается, что самый внешний DSQL представляет собой скрипт, формирующий и выполняющий другой скрипт, внутри которого все переменные объявлены, инициализированы и используются в самом внутреннем EXEC().
Некоторые детали опущены. И прошу прощения, если опять непонятно.
17 июн 09, 13:28    [7310092]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить