Динамическая подстановка

max79
Дата: 10.02.2013 00:05:33
Задача: Создать функцию, где в приходящей строке (MessageBody) типа 'Dear <%FirstName%> <%LastName%> go to <%Email%>' заменить теги на информацию о пользователе из таблицы users с данным ID. Тэги представляют собой имена полей ( естественно в приходящей строке могут быть разные )

1 использование динамического SQL невозможно, понятно по причинине того что это должна быть функция.
2 естественно хардкодить имена полей таблицы users в коде нельзя, по причине жалаемого уровня гибкости
3 вот если бы была возможность доступа к значениям набора данных (запрос, временная таблица) по номеру столбца а не по имени. (но такой фитчи раскопать не могу)
Have somone any ideas? как говорят мои амерские партнеры ::--))
Заранее спасибо за генерацию идей....

P.S нахала Glory просьба не беспокоить
alexeyvg
Дата: 10.02.2013 00:33:16
max79
2 естественно хардкодить имена полей таблицы users в коде нельзя, по причине жалаемого уровня гибкости
Только хардкодить.
max79
Дата: 10.02.2013 00:44:57
Спасибо за столь оптимистичный ответ. (без обид) ЖЖ--))
а если получить всю инфу о юзере в виде одной строки? Как?
а если строку транспонировать в столбец? На низком уровне ведь это возможно. mssql же умеет писать результаты в текст. Как?
qwerty112
Дата: 10.02.2013 02:54:31
max79
Задача: Создать функцию, где в приходящей строке (MessageBody) типа 'Dear <%FirstName%> <%LastName%> go to <%Email%>' заменить теги на информацию о пользователе из таблицы users с данным ID. Тэги представляют собой имена полей ( естественно в приходящей строке могут быть разные )

create table t (FirstName varchar(20), LastName varchar(20), Email varchar(20), SomeShit1 varchar(20))
insert into t values ('Gates', 'Billy', 'billy@microsoft.com', 'xz')

-- =============================================
create FUNCTION [dbo].HabaHaba
		(@str varchar(max))
RETURNS  varchar(max)
AS
BEGIN
	declare @xml xml
	set @xml = (select * from t for xml raw, elements)
	--
	select @str=replace(@str, '<%'+a.xz1+'%>', a.xz2)
	from
		(select 
			 t.c.value('local-name(.)', 'varchar(20)') as xz1
			,t.c.value('./text()[1]', 'varchar(20)') as xz2
		from @xml.nodes('/row/*') as t(c)) a
	--
  	return @str
END

select [dbo].HabaHaba('Dear <%FirstName%> <%LastName%> go to <%Email%> and <%SomeShit1%>. Best regards !')
select [dbo].HabaHaba('Dear <%FirstName%> <%LastName%> go to <%Email%> and <%SomeShit2%>. Best regards !')

----------------------------------------------------------------------------------
Dear Gates Billy go to billy@microsoft.com and xz. Best regards !

(1 row(s) affected)

----------------------------------------------------------------------------------
Dear Gates Billy go to billy@microsoft.com and <%SomeShit2%>. Best regards !

(1 row(s) affected)
max79
Дата: 13.02.2013 21:43:39
qwerty112 просто снимаю шляпу, огромное спасибо

Glory ты нажил себе врага. Здесь на сайте я вижу администрация игнорирует сообщения о твоем поведении, но в мире о тебе уже пишут кто ты есть http://blogs.msdn.com/b/alexejs/archive/2009/03/30/sql-ru.aspx
Glory
Дата: 13.02.2013 22:46:44
max79
Glory ты нажил себе врага. Здесь на сайте я вижу администрация игнорирует сообщения о твоем поведении, но в мире о тебе уже пишут кто ты есть

Вот там в следующий раз и публикуйте ваши "рекомендации", кому и что вы соизвоялете говорить. И угрозы свои туда же засуньте.