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

Откуда:
Сообщений: 9
В поле таблицы записаны SQL-запросы в типе данных varchar.
То есть каждая запись таблицы имеет тип данных varchar.
В таблице только одно поле.
Как мне выполнить каждый запрос, то есть каждую запись таблицы.
Например, вот записи таблицы:
UPDATE dbo.proba1 SET f1 = '0.0' WHERE f1 = '';
UPDATE dbo.proba1 SET f2 = '0.0' WHERE f2 = '';
UPDATE dbo.proba1 SET f3 = '0.0' WHERE f3 = '';
26 янв 12, 00:40    [11972851]     Ответить | Цитировать Сообщить модератору
 Re: Сделать записи таблицы исполняемым кодом  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
declare cursor + https://www.sql.ru/faq/faq_topic.aspx?fid=104
26 янв 12, 01:11    [11972927]     Ответить | Цитировать Сообщить модератору
 Re: Сделать записи таблицы исполняемым кодом  [new]
Oreolana
Member

Откуда:
Сообщений: 9
Извиняюсь. А можно для тех, кто в бронепоезде?
какой-то простой пример.
26 янв 12, 11:15    [11973964]     Ответить | Цитировать Сообщить модератору
 Re: Сделать записи таблицы исполняемым кодом  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Oreolana
В таблице только одно поле.
Ничего сделать нельзя, ибо не задан порядок выполнения инструкций SQL!
26 янв 12, 11:17    [11973986]     Ответить | Цитировать Сообщить модератору
 Re: Сделать записи таблицы исполняемым кодом  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Oreolana,
что типа такого
DECLARE @str nvarchar(max)

DECLARE cur_exec CURSOR FAST_FORWARD READ_ONLY FOR
select field_str from table

OPEN cur_exec

FETCH NEXT FROM field_str INTO @str

WHILE @@FETCH_STATUS = 0
BEGIN

exec sp_executesql @str

FETCH NEXT FROM cur_exec INTO cur_exec

END

CLOSE cur_exec
DEALLOCATE cur_exec
26 янв 12, 11:20    [11974012]     Ответить | Цитировать Сообщить модератору
 Re: Сделать записи таблицы исполняемым кодом  [new]
Oreolana
Member

Откуда:
Сообщений: 9
denis2710, Спасибо за пример!
Мне стало понятней, что делать)
26 янв 12, 13:46    [11975419]     Ответить | Цитировать Сообщить модератору
 Re: Сделать записи таблицы исполняемым кодом  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Проще без курсора в данном случае:
DECLARE	 @Query	VarChar(max)
SELECT	@Query = (	
	SELECT	T.QueryField + '
'	FROM	dbo.MyTable T
	FOR XML Path(''),Type).value('text()[1]','VarChar(max)')

PRINT @Query
--EXEC (@Query) -- EXEC sp_executesql @Query
26 янв 12, 14:49    [11976069]     Ответить | Цитировать Сообщить модератору
 Re: Сделать записи таблицы исполняемым кодом  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Mnior,
set @Query = ( select T.QueryField + ' ; ' as 'data()'
             from   dbo.MyTable T
           for
             xml path('')
           )
26 янв 12, 15:09    [11976336]     Ответить | Цитировать Сообщить модератору
 Re: Сделать записи таблицы исполняемым кодом  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
denis2710, для понимания:

BEGIN TRAN
CREATE TABLE #test(QueryField VARCHAR(MAX))

INSERT INTO #test
        ( QueryField )
VALUES  ( 'select case when 1>1 then 1 else 1&1 end test')

DECLARE @Query VARCHAR(MAX)

SET @Query = ( SELECT   T.QueryField + ' ; ' AS 'data()'
               FROM     #test T
             FOR
               XML PATH('')
             )

PRINT @Query
ROLLBACK
26 янв 12, 15:28    [11976565]     Ответить | Цитировать Сообщить модератору
 Re: Сделать записи таблицы исполняемым кодом  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
kDnZP,Согласен
set @Query =''
select @Query = @Query +  QueryField +  ' ' 
from #test
print @Query 
26 янв 12, 15:38    [11976674]     Ответить | Цитировать Сообщить модератору
 Re: Сделать записи таблицы исполняемым кодом  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
denis2710
SELECT ( select T.QueryField + ' ; ' as 'data()'
             from   dbo.MyTable T
           for xml path(''))
Дъявол в деталях:
AS 'data()' -> AS [*] -- Эквивалентно
SELECT (SELECT 'Тест <на> полную & тотальную совместимоть' FOR XML Path(''))
-- Тест &lt;на&gt; полную &amp; тотальную совместимоть
---
FOR XML Path(''), Type).value('text()[1]','VarChar(max)') -- Самый оптимальный вариант


denis2710
select @Query = @Query +
Неймётся вам. К сожалению не могу вспомнить баи для этого случая.
Но самое главное что Cast обязателен. Кста есть оператор "+=".

В FOR XML Path удобнее сложные веши собирать (можно тупо через запятую без Convert) и работает лучше. Опять же - проверено.
26 янв 12, 17:30    [11977931]     Ответить | Цитировать Сообщить модератору
 Re: Сделать записи таблицы исполняемым кодом  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Mnior,

Mnior
Неймётся вам.

С чего взяли?
Этот вариант самый наглядный и понятный,что скорей всего в данном случае является большим достоинством.
26 янв 12, 17:53    [11978261]     Ответить | Цитировать Сообщить модератору
 Re: Сделать записи таблицы исполняемым кодом  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
denis2710
Этот вариант самый наглядный и понятный,что скорей всего в данном случае является большим достоинством.

А если сделать нечто подобное?
BEGIN TRAN
CREATE TABLE #test(gr INT, rn INT, QueryField VARCHAR(MAX))

INSERT INTO #test
        ( gr, rn, QueryField )
SELECT 1,1,'case when 1>1 then 1 else 1&1 end test' UNION ALL
SELECT 1,2,'2 test2' UNION ALL
SELECT 1,3,'3 test3' UNION ALL
SELECT 2,2,'2 test2' UNION ALL
SELECT 2,3,'3 test3' UNION ALL
SELECT 2,1,'''Test'' tst'

DECLARE @Query VARCHAR(MAX)

SELECT @Query=(
        SELECT  CASE WHEN t1.gr>1 THEN '; '
                                         ELSE ''
                                    END+t2.s
        FROM    (
                 SELECT DISTINCT
                        gr
                 FROM   #test
                ) t1
        CROSS APPLY (
                     SELECT (
                            SELECT  CASE WHEN t2.rn>1 THEN ', '
                                         ELSE 'select '
                                    END+t2.QueryField
                            FROM    #test t2
                            WHERE   t2.gr=t1.gr
                            ORDER BY t2.rn
                     FOR    XML PATH('')
                               ,TYPE).value('.','VarChar(max)')
                    ) t2 (s)
        ORDER BY t1.gr
FOR     XML PATH('')
           ,TYPE).value('.','VarChar(max)')


PRINT @Query
EXEC (@Query)
ROLLBACK
26 янв 12, 20:33    [11979244]     Ответить | Цитировать Сообщить модератору
 Re: Сделать записи таблицы исполняемым кодом  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
kDnZP
denis2710
Этот вариант самый наглядный и понятный,что скорей всего в данном случае является большим достоинством.

А если сделать нечто подобное?

Это ко мне вопрос?
26 янв 12, 22:13    [11979686]     Ответить | Цитировать Сообщить модератору
 Re: Сделать записи таблицы исполняемым кодом  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
denis2710, по большей мере это не вопрос...
TOP 100 PERCENT ... ORDER BY ...
применять не рекомендуется, а как без него вы обеспечите нужный порядок? Ну и опять же XML PATH для сборки строк - часто применяем и вполне даже прост, как по мне.
26 янв 12, 22:29    [11979778]     Ответить | Цитировать Сообщить модератору
 Re: Сделать записи таблицы исполняемым кодом  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
kDnZP,
по мне тоже ни чего сложного и чего?
26 янв 12, 22:42    [11979870]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить