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

Откуда: Санк-Петербург
Сообщений: 65
Пытаюсь создать табличную функцию, вот код:
CREATE FUNCTION [dbo].[BatchErrTestFio] (@bi int)

RETURNS @tbl table (bi int,ps int,er int)
AS
BEGIN
declare @er int,@ps int
;
with PSN as (
select b
,r
,tt.xx.value('FIO_1[1]','nvarchar(max)') as f1
,tt.xx.value('FIO_2[1]','nvarchar(max)') as f2
-- ,tt.xx.value('FIO[1]','nvarchar(max)') as f
,tt.xx.value('TabNum_1[1]','nvarchar(max)') as t1
,tt.xx.value('TabNum_2[1]','nvarchar(max)') as t2
-- ,tt.xx.value('TabNum[1]','nvarchar(max)') as t
from (select CAST(Xdocument AS XML) as x,batch_id as b,rec_id as r from TEST..Record where Batch_id=@bi) as t
cross apply x.nodes('root/TableRow') as tt(xx)
)

Select @er=count (r) from psn
where not f1=f2
and not f1 is null
and not f2 is null
group by b

Select @ps=count (r) from psn
where not f2 is null
group by b

insert @tbl values(@bi,@ps,@er)

return
END


Прекрасно работала, когда была скалярной и выводила одно значение, а сейчас при вызове Selectом выдаёт ошибку:
Сообщение 208, уровень 16, состояние 1, строка 2
Invalid object name 'psn'.

Как тогда иначе создавать сложную цепочкку запросов, это только начало моей новой работы на T-Sql? не хотелось бы создавать цепь вложенных функций.

Заранее благодарна за совет.
15 авг 11, 13:01    [11119452]     Ответить | Цитировать Сообщить модератору
 Re: вопрос к гуру  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5126
а коллейшн у вас чувствительный к регистру?
15 авг 11, 13:03    [11119475]     Ответить | Цитировать Сообщить модератору
 Re: вопрос к гуру  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
А для второго вашего селекта with кто дописывать будет?

Сообщение было отредактировано: 15 авг 11, 13:05
15 авг 11, 13:04    [11119485]     Ответить | Цитировать Сообщить модератору
 Re: вопрос к гуру  [new]
iljy
Member

Откуда:
Сообщений: 8711
Елена Гох,

переделайте ее в inline, будет гораздо быстрее, компактнее и проще для понимания.
CREATE FUNCTION [dbo].[BatchErrTestFio] (@bi int)
RETURNS table AS
return (
	with PSN as (
		select b 
		,r 
		,tt.xx.value('FIO_1[1]','nvarchar(max)') as f1
		,tt.xx.value('FIO_2[1]','nvarchar(max)') as f2
		-- ,tt.xx.value('FIO[1]','nvarchar(max)') as f
		,tt.xx.value('TabNum_1[1]','nvarchar(max)') as t1
		,tt.xx.value('TabNum_2[1]','nvarchar(max)') as t2
		-- ,tt.xx.value('TabNum[1]','nvarchar(max)') as t
		from (select CAST(Xdocument AS XML) as x,batch_id as b,rec_id as r from TEST..Record where Batch_id=@bi) as t
		cross apply x.nodes('root/TableRow') as tt(xx)
	) 
	Select @bi, sum(case when f1!=f2 and f1 is not null and r is not null then 1 else 0 end),
		count(r)
	from psn 
	where not f2 is null
)
15 авг 11, 14:14    [11120128]     Ответить | Цитировать Сообщить модератору
 Re: вопрос к гуру  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Поделюсь-ка я с вами одним недавним наблюдением.
Может, кто разъяснит мне, неразумному...

Делал inline функцию, как только что iljy написал (с CTE то есть).
И при вызове она зависала на много-много минут (ни разу конца не дождался).
Помыкавшись, переделал CTE в производную таблицу - стала выполняться за миллисекунды!

Вот, до сих пор так и не понял, что за фича такая?

Microsoft SQL Server 2008 (SP2) - 10.0.4000.0 (X64)
15 авг 11, 14:21    [11120196]     Ответить | Цитировать Сообщить модератору
 Re: вопрос к гуру  [new]
iljy
Member

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

тайна сия велика есть. А план чего говорил?
15 авг 11, 14:35    [11120301]     Ответить | Цитировать Сообщить модератору
 Re: вопрос к гуру  [new]
iap
Member

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

тайна сия велика есть. А план чего говорил?
Уже не помню.
Завелось, - я на радостях так и оставил.
15 авг 11, 14:39    [11120328]     Ответить | Цитировать Сообщить модератору
 Re: вопрос к гуру  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Actual plan я ж не дождался ни разу, как уже отмечал.
15 авг 11, 14:40    [11120333]     Ответить | Цитировать Сообщить модератору
 Re: вопрос к гуру  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
iap
Помыкавшись, переделал CTE в производную таблицу - стала выполняться за миллисекунды!


Возможно широко рекламируемая возможность SQL-я выразить один запрос дюжиной способов вовсе не преимущество, а предусмотрительно заложенная возможность обхода сырых участков кода движка?
15 авг 11, 14:46    [11120405]     Ответить | Цитировать Сообщить модератору
 Re: вопрос к гуру  [new]
Елена Гох
Member

Откуда: Санк-Петербург
Сообщений: 65
Спасибо всем огромное, особенно iljy, получилось! И интересную тему подняла.
17 авг 11, 16:01    [11134197]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить