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

Откуда:
Сообщений: 184
Доброго времени суток форумчане.
Версия
Microsoft SQL Server 2008 R2 (RTM) Standart 

Задача следующая :
Имеется таблица :
INSERT INTO @tbl (id ,name,[percent])
SELECT 1 ,'select [USER_ID] from [dbo].[mon_logins] where id = @id','%01'
UNION ALL
SELECT 2 ,'select [ip] from [dbo].[mon_logins] where id = @id','%02'


declare @id int = 2

Переменная
 declare @txt varchar(max) = 'abcd %1 abcdre %2'


Нужно заменить проценты @txt на то что возвратит запрос.В таблице и в тексте много процентов для примерв привел 2. Ответ должен выглядить
 'abcd (то что возвратит [USER_ID]) abcdre (то что возвратит [ip])'


Помогите пожалуйста как решить ?
23 июл 15, 15:22    [17925980]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
NewBie77
Member

Откуда:
Сообщений: 184
В первом посте отпечатка :
Переменная
 declare @txt varchar(max) = 'abcd %01 abcdre %02'


----------------------------------------------------------------------------------
сам пробовал статическим текстом и решил таким образом ,но мне нужно динамически достать с таблицы

declare @txt varchar(max) = 'abcd %01 abcdre %02'
declare @tbl TABLE (id int,name varchar(500),[percent] char(3))
declare @id int = 1

INSERT INTO @tbl (id ,name,[percent])
SELECT 1 ,'145','%01'
UNION ALL
SELECT 2 ,'127.0.0.1','%02'

SELECT @txt = REPLACE(@txt, [percent], ISNULL(name, ''))
FROM @tbl
WHERE CHARINDEX([percent], @txt) > 0

SELECT @txt
23 июл 15, 15:28    [17926024]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
Владислав Колосов
Member

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

вообще-то этим должен клиент заниматься.
23 июл 15, 15:42    [17926136]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
NewBie77
Member

Откуда:
Сообщений: 184
Владислав Колосов,

К сожалению приходится на стороне базы .Но не знаю как динамически достать информацию в данном случае
23 июл 15, 15:46    [17926166]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
NewBie77
Member

Откуда:
Сообщений: 184
Может кто помочь ?
23 июл 15, 16:14    [17926349]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
Glory
Member

Откуда:
Сообщений: 104751
NewBie77
Может кто помочь ?

Вы разве не сделали "и решил таким образом" ?
23 июл 15, 16:17    [17926383]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
NewBie77
не знаю как динамически достать информацию в данном случае
"Динамически" - у вас вот эти подстановки '%01' - определённые? Это строки таблицы, или это поля какой то таблицы?

Можно таблицу @tbl раскрыть, используя PIVOT, потом сделать вложенный реплейс.
23 июл 15, 16:18    [17926390]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
Konst_One
Member

Откуда:
Сообщений: 11621
динамический sql (пример из BOL):

DECLARE @IntVariable INT;
DECLARE @SQLString NVARCHAR(500);
DECLARE @ParmDefinition NVARCHAR(500);

/* Build the SQL string one time. */
SET @SQLString =
     N'SELECT * FROM AdventureWorks2008R2.Sales.Store WHERE SalesPersonID = @SalesID';
/* Specify the parameter format one time. */
SET @ParmDefinition = N'@SalesID int';

/* Execute the string with the first parameter value. */
SET @IntVariable = 275;
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @SalesID = @IntVariable;
/* Execute the same string with the second parameter value. */
SET @IntVariable = 276;
EXECUTE sp_executesql @SQLString, @ParmDefinition,
                      @SalesID = @IntVariable;
23 июл 15, 16:21    [17926416]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
NewBie77
Member

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

С статическим текстом у меня получается , а вот с выборкой в колонке нет.

alexeyvg,

да проценты определенные
23 июл 15, 16:23    [17926426]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
NewBie77
да проценты определенные
Ну вот и напишите вложенными реплейсами.
23 июл 15, 16:28    [17926464]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
Одним запросом заменить не получится, надо будет делать курсор по Вашей таблице, и обрабатывать строку за строчкой.

Вообще у Вас рискованная архитектура - а если в строковой коснтанте окажется запрос, возвращающий более одной колонки?
23 июл 15, 16:31    [17926485]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Кот Матроскин
Одним запросом заменить не получится, надо будет делать курсор по Вашей таблице, и обрабатывать строку за строчкой.

Вообще у Вас рискованная архитектура - а если в строковой коснтанте окажется запрос, возвращающий более одной колонки?
Да можно распарсить на строки датасета и собрать обратно с заменой.
Или сейчас кто-нибудь из спецов по XML и XQuery придёт и покажет вариант.
Или сделать CLR-функцию для этого дела...

Первый способ я кажется тут как-то писал
23 июл 15, 16:36    [17926520]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
NewBie77
Member

Откуда:
Сообщений: 184
iap,
Можете показать пример ?
23 июл 15, 16:39    [17926555]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
NewBie77
iap,
Можете показать пример ?
Пример чего?
23 июл 15, 16:43    [17926585]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
NewBie77
Member

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

распарсить на строки датасета и собрать обратно с заменой.
23 июл 15, 16:44    [17926594]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
iap
Кот Матроскин
Одним запросом заменить не получится, надо будет делать курсор по Вашей таблице, и обрабатывать строку за строчкой.

Вообще у Вас рискованная архитектура - а если в строковой коснтанте окажется запрос, возвращающий более одной колонки?
Да можно распарсить на строки датасета и собрать обратно с заменой.
Или сейчас кто-нибудь из спецов по XML и XQuery придёт и покажет вариант.


Не понял - это ответ на первую фразу или на вторую?

Если на первую - как XML и XQUERY помогут выполнить N динамических запросов в рамках одного?
23 июл 15, 16:46    [17926604]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Кот Матроскин
Если на первую - как XML и XQUERY помогут выполнить N динамических запросов в рамках одного?
Если бы я так делал, то сразу бы написал бы ответ. А так - "Слышал звон, да не знаю где он".
NewBie77
распарсить на строки датасета и собрать обратно с заменой
Нужно сделать замену одного слова на другое
23 июл 15, 16:49    [17926624]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Кот Матроскин
Не понял - это ответ на первую фразу или на вторую?
Вообще, на первую - я же точно знаю, что одним запросом можно.
23 июл 15, 16:52    [17926633]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Кот Матроскин,

кстати, в XQuery же есть и свои циклы, и свой REPLACE() и много-много чего ещё.
Я в этом пока плаваю, так что меня про подробностии спрашивать бесполезно.
23 июл 15, 16:57    [17926658]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
NewBie77
Member

Откуда:
Сообщений: 184
DECLARE @tbl TABLE (id int,name nvarchar(max),[percent] char(3),is_updated tinyint)
declare @a int = 1
INSERT INTO @tbl (id ,name,[percent],is_updated )
SELECT 1 ,'select [USER_ID] from [dbo].[mon_logins] where id= @id','%01',0
UNION ALL
SELECT 2 ,'select [ip] from [dbo].[mon_logins] where id= @id','%02',0

UPDATE @tbl SET name = REPLACE(name,'@id',@a) 

declare @name nvarchar(max),@id int
declare @tbl_name TABLE(response nvarchar(max))
declare @response nvarchar(max)
declare @txt varchar(max) = 'abc %01 abcde %02'

WHILE EXISTS (SELECT TOP 1 1 FROM @tbl where is_updated = 0)
BEGIN
select @id = id ,@name = name from @tbl where is_updated = 0

insert into @tbl_name(response)
exec(@name)

select @response = response from @tbl_name

UPDATE @tbl set is_updated = 1, name = @response where id = @id

delete from @tbl_name
END

SELECT @txt = REPLACE(@txt, [percent], ISNULL(name, ''))
FROM @tbl
WHERE CHARINDEX([percent], @txt) > 0

select @txt 


Не красиво но работает
23 июл 15, 17:03    [17926701]     Ответить | Цитировать Сообщить модератору
 Re: Multiple replace  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 8933
iap
Кот Матроскин,

кстати, в XQuery же есть и свои циклы, и свой REPLACE() и много-много чего ещё.
Я в этом пока плаваю, так что меня про подробностии спрашивать бесполезно.


Циклы, Replac-ы - это сколько угодно, я тут ничуть не спорю. SP_executeSQL (в тем более несколько) внутри запроса не получится - вот я про что.
23 июл 15, 17:07    [17926726]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить