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

Откуда:
Сообщений: 175
Доброго времени суток!
Мне нужно написать функцию, которая выберет запись из таблицы, где имя таблицы, имя колонки и значения для фильтра where передайтся входными параметрами.
Это что-то вроде заготовки, как довести до ума пока не знаю
create function GetStringByid(
@tableName varchar(10),
@colname varchar(10),
@id int)

returns varchar(max)
as
begin
	DECLARE @sql varchar(max)
	set @sql = 'select ' + @colname + ' from ' + @tableName + ' where id = ' + @id
...........
end
5 авг 11, 15:15    [11076984]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
tttttt
Guest
c_veter,

EXEC ( @sql )
5 авг 11, 15:16    [11077000]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
Мне нужно написать функцию...


а не получится...
5 авг 11, 15:16    [11077002]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
c_veter
Member [скрыт] [заблокирован]

Откуда:
Сообщений: 175
tttttt
c_veter,

EXEC ( @sql )

Invalid use of a side-effecting operator 'EXECUTE STRING' within a function.

pkarklin
автор
Мне нужно написать функцию...


а не получится...

а почему?)
5 авг 11, 16:26    [11077633]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
Glory
Member

Откуда:
Сообщений: 104751
c_veter
pkarklin
пропущено...


а не получится...

а почему?)

Потому что
Invalid use of a side-effecting operator 'EXECUTE STRING' within a function.
5 авг 11, 16:27    [11077648]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
Lithium
Member

Откуда: Волгодонск
Сообщений: 28
Glory,

Логично бы продолжить, а что можно предпринять в случаях, когда всё-таки требуется выполнять динамические запросы в UDF ?
23 мар 12, 11:34    [12300585]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
iap
Member

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

до SQL2000 UDF вообще не было. И как-то жили...
Никакой такой особой потребности в DSQL внутри UDF вроде бы не наблюдается.

Я могу, конечно, научить плохому. Но надо ли?
23 мар 12, 11:43    [12300666]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
Sergey Sizov
Member

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

Логично бы продолжить, а что можно предпринять в случаях, когда всё-таки требуется выполнять динамические запросы в UDF ?
Логично бы продолжить в направлении определения правильности подхода, а не поиска обходов в результатете применения подхода, требующего обходов.
23 мар 12, 11:55    [12300766]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
Lithium
Member

Откуда: Волгодонск
Сообщений: 28
iap,

Вероятно Вы правы, но порой такая потребность возникает. Вернее, это первое самое простое что приходит на ум, в силу неосведомлённости.

Если Вам известно, как можно избавиться от дублирования однотипного кода, будьте любезны, подскажите. А задача у меня такая - сделать функцию, которая по имени таблицы и поля вернёт строку, содержащую все значения этого поля, раделённые указанными символами, пусть запятой для примера.

Без функции я это делаю так:
...
set @Result = ''
set @koi = (select top 1 Key_Origin from Doc_Origins order by Key_Origin asc)
while @koi is not null
begin
-- записать очередную строку
set @Result = @Result + (select Permits from Doc_Origins where Key_Origin = @koi) + ','
-- инкрементировать "индекс"
set @koi = (select top 1 Key_Origin from Doc_Origins where Key_Origin > @koi order by Key_Origin)
end

Буду признателен за помощь.
23 мар 12, 12:01    [12300824]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
Lithium
Member

Откуда: Волгодонск
Сообщений: 28
Key_Origin - уникальный ключ таблицы, int, автоинкрементный
Permits - поле данных, которое нужно собрать
23 мар 12, 12:05    [12300869]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
iap
Member

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

то есть, в параметре функции надо передать не "имя таблицы и имя поля", а просто поле таблицы из FROM запроса?
В SQL2005 появился APPLY специально для передачи в функцию поля таблицы (а не имён).
Но я думаю, Вы что-то едоговариваете. Функция, наверно, вообще не нужна.
23 мар 12, 12:09    [12300906]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
iap
Member

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

то есть, в параметре функции надо передать не "имя таблицы и имя поля", а просто поле таблицы из FROM запроса?
В SQL2005 появился APPLY специально для передачи в функцию поля таблицы (а не имён).
Но я думаю, Вы что-то едоговариваете. Функция, наверно, вообще не нужна.
Хотя, нет, речь идёт об обработке не одного значения переданного поля текущей записи,
а поля для всех записей таблицы? Тогда я был неправ. В обычной UDF так нельзя.
23 мар 12, 12:13    [12300927]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
Lithium
Member

Откуда: Волгодонск
Сообщений: 28
iap
iap
Lithium,

то есть, в параметре функции надо передать не "имя таблицы и имя поля", а просто поле таблицы из FROM запроса?
В SQL2005 появился APPLY специально для передачи в функцию поля таблицы (а не имён).
Но я думаю, Вы что-то едоговариваете. Функция, наверно, вообще не нужна.
Хотя, нет, речь идёт об обработке не одного значения переданного поля текущей записи,
а поля для всех записей таблицы? Тогда я был неправ. В обычной UDF так нельзя.


Да, именно так, для всех записей таблицы. Т.е. из таблицы

А
Б
В

требуется получить строку А,Б,В
23 мар 12, 12:16    [12300939]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Lithium
iap
пропущено...
Хотя, нет, речь идёт об обработке не одного значения переданного поля текущей записи,
а поля для всех записей таблицы? Тогда я был неправ. В обычной UDF так нельзя.


Да, именно так, для всех записей таблицы. Т.е. из таблицы

А
Б
В

требуется получить строку А,Б,В
Это элементарно делается коррелированным подзапросом.
Функция не нужна.
И до сих пор неизвестна версия сервера
23 мар 12, 12:18    [12300951]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
Lithium
Member

Откуда: Волгодонск
Сообщений: 28
iap,

Product - Microsoft SQL Server Standard Edition (64-bit)
Operating System - Microsoft Windows NT 6.1 (7600)
Platform - NT x64
Version - 10.0.1600.22

А не могли бы Вы пример такого запроса показать?
23 мар 12, 12:28    [12301024]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
iap, ну так Lithium считает, что каждый раз писать подзапрос -- это дублирование кода, и хочет универсальную функцию.

Lithium, если уж совем невозможно жить без такой функции, напишите ее на CLR.
23 мар 12, 12:29    [12301030]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
invm
iap, ну так Lithium считает, что каждый раз писать подзапрос -- это дублирование кода, и хочет универсальную функцию.

Lithium, если уж совем невозможно жить без такой функции, напишите ее на CLR.
А я вот не хотел учить плохому!
23 мар 12, 12:33    [12301056]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
Lithium
Member

Откуда: Волгодонск
Сообщений: 28
invm,

Вы правы. Всегда хочется наделать "кирпичиков" чтобы потом что-то большое ваять. Но в данном случае подзапрос меня бы устроил, если его можно использовать в условии join, или в качестве одного из возвращаемых полей select.
23 мар 12, 12:34    [12301065]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Lithium
invm,

Вы правы. Всегда хочется наделать "кирпичиков" чтобы потом что-то большое ваять. Но в данном случае подзапрос меня бы устроил, если его можно использовать в условии join, или в качестве одного из возвращаемых полей select.
В А, Б и В что реально находится?

И упомяну, всё же про FAQ, в котором есть несколько способов решить задачу.
23 мар 12, 12:41    [12301122]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
Lithium
Member

Откуда: Волгодонск
Сообщений: 28
Поле может быть varchar, int, date. В общем-то может быть любой простой тип, который можно преобразовать в строку (varchar).
Попробую тем временем FAQ...
23 мар 12, 13:28    [12301550]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
Lithium
Member

Откуда: Волгодонск
Сообщений: 28
Перечитываю, видимо плохо на словах я объясняю. Попробую кодом.

declare @Test table ([Name] NVARCHAR(100))
INSERT dbo.TEST VALUES('Лошадь')
INSERT dbo.TEST VALUES('Диван')
INSERT dbo.TEST VALUES('Долото')

select dbo.TableToStr('@Test', 'Name')

-- а результат запроса вернул бы
'Лошадь, Диван, Долото'
23 мар 12, 13:40    [12301679]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Lithium
Поле может быть varchar, int, date. В общем-то может быть любой простой тип, который можно преобразовать в строку (varchar).
Попробую тем временем FAQ...
Дело в том, что в некоторых решениях важно, какие именно символы допускаются.
Наиболее общее с помощью FOR XML PATH(''):
WITH T(X,Y) AS (SELECT 1, 'А' UNION ALL SELECT 1, 'Б' UNION ALL SELECT 1, 'В' UNION ALL SELECT 2, 'C' UNION ALL SELECT 2, 'D')
SELECT X, Y=STUFF((SELECT ','+TT.Y FROM T TT WHERE TT.X=T.X FOR XML PATH(''), TYPE).value('.','varchar(max)'),1,1,'')
FROM T
GROUP BY X;
23 мар 12, 13:54    [12301806]     Ответить | Цитировать Сообщить модератору
 Re: получить записи из таблицы, имя таблицы задаётся входным параметром  [new]
Lithium
Member

Откуда: Волгодонск
Сообщений: 28
iap,

Выражаю свою благодарность! Вы мне очень помогли в решении вопроса. Действительно, можно обойтись без динамических запросов и в моём случае :)
23 мар 12, 14:00    [12301873]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить