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

Откуда: Москва
Сообщений: 14
Всем доброго времени суток.

Столкнулся с задачкой, не могу понять, как красиво решить.
Есть исходная таблица, назову её #Strings, в ней находится массив строк, основные строки и строки для подстановки внутрь основных. Упрощённый пример:

StringTypeStringNameStringInsertPointUseCase
'Main' 'Base1' 'P1 мыла P2' Null Null Null
'Sub' 'Substr1' 'Маша' 'P1' 1 1
'Sub' 'Substr2' 'Мама' 'P1' 1 2
'Sub' 'Substr3' 'раму' 'P2' 1 1
'Sub' 'Substr3' 'посуду' 'P2' 1 2
'Sub' 'Substr3' 'Утконос' 'P1' 0 3


В базовых строках Main размечены точки подстановки, в которые нужно подставить строки Sub.
Подставлять нужно только есть Use = 1.
В одной итоговой строке должны быть только подстановки с одинаковыми Case.

Для приведенного примера в итоге нужно получить "Маша мыла раму" и "Мама мыла посуду".

Курсором понятно как сделать, но хочется поизящнее.

Рекурсивный запрос у меня не вышло заставить работать экономно - он перемножает все подстановки и делает их по нескольку раз, формируя каждую из строк всеми возможными последовательностями подстановок. Делал примерно так:
WITH XXX (StringType, StringName, String, InsertPoint, Use, Case)
 AS (
   SELECT StringType, StringName, String, InsertPoint, Use, Case
   FROM #Strings
   WHERE StringType = 'Main'
   
   UNION ALL
   
   SELECT StringType, StringName, REPLACE (XXX.String, St.InsertPoint, St.String), InsertPoint, Use, ST.Case
    FROM XXX
    INNER JOIN #Strings St on CHARINDEX(XXX.String, St.InsertPoint) <> 0
       and (St.Case = XXX.Case
             or XXX.Case is NULL)
    WHERE  St.Use = 1
       and St.StringType = 'Sub'
   )
 SELECT * FROM XXX


Можно как-то ограничить рекурсивную часть, чтобы при каждой итерации производились не все возможные ещё не произведённые подстановки, а, например, первая попавшаяся?

TOP в рекурсивной части использовать не даёт.

Или может есть какой-нибудь другой способ сделать, то, что мне нужно, одним запросом?

Заранее благодарен.
21 апр 12, 01:41    [12449835]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
aleks2
Guest
;with
main as ( select * FROM #Strings WHERE StringType = 'Main' and [use] = 1)
,
substs as ( select *
				, row_number() over(partition by [Case] order by InsertPoint) n 
				, row_number() over(partition by [Case] order by InsertPoint DESC) n1 
	FROM #Strings WHERE StringType = 'Sub' and [use] = 1 )
,
results as (
	select String, [Case], 0 as n1, 0 as n  from main
	union all
             select REPLACE(M.String, InsertPoint, S.String) String, M.[Case], S.n1, S.n
	from results M inner join substs S on M.[Case]=S.[Case] and S.n=M.n+1
)
select * from results where n1=1
21 апр 12, 06:40    [12450155]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
Agarez
Member

Откуда: Москва
Сообщений: 14
aleks2, принцип понял. Спасибо большое!
21 апр 12, 15:04    [12450733]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Agarez
Или может есть какой-нибудь другой способ сделать, то, что мне нужно, одним запросом?
Да, конечно. Не надо ограничивать себя. Не ограничиваться SQL.
Есть другие технологии, намного удобнее и заточенные на это.
Посмотрите в сторону XSLT например.

Чёрт, не успел, клиент ушёл.
21 апр 12, 15:37    [12450790]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
Agarez
Member

Откуда: Москва
Сообщений: 14
Mnior, SQL тут принципиален, т.к. в табличке на самом деле хранятся строки запросов и разнообразные доп куски к ним. Надо по ветвистому дереву входных параметров собрать запросы и выполнить их в цикле.
21 апр 12, 19:30    [12451305]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Ещё один монстр? © iap
Что-то загнули с динамическими запросами.
Мне кажется поддержка всего это ветвистого комбайна дороговато и он быстро загнётся.
Может не побоятся сохранить их в виде вьюх и функций?
Чем они вас не устраивают?
21 апр 12, 21:01    [12451504]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
Agarez
Member

Откуда: Москва
Сообщений: 14
Несколько причин.

Процедура должна по ряду критериев отождествления связывать небольшой массив (100-40000 записей) с здоровой базой, несколько миллионов записей только в основной таблице. Критерии собраны в группы и в каждой из групп есть подгруппы, убывающие по степени строгости, подгруппы отличаются друг от друга одним-двумя условиями. Порядок применения групп критериев и степень до которой в каждой из них можно ослабляться зависят от специфики куска данных, который хотим привязать в каждом отдельном случае. То есть состав и порядок выполнения запросов нужно иметь возможность менять простой настройкой. Разделение выполнения тоже важно - то, что привязалось по более строгим и быстрым критериям, должно исключаться при привязке приблизительным и медленным способом.

Доп. критериев много, базовых запросов мало. Критерии могут быть очень тяжёлыми, содержат подзапросы, текстовые преобразования\сравнения и т.п. Если всё это написать в один большой мегазапрос, он будет нечитаем и дико тормозит даже на небольшом объёме, проверяли.

Первоначально запросы по всем вариантам критериев лежали в процедуре прямым текстом. (перемену мест решали многократным запуском) Часть вариаций включили внутрь самих запросов, часть вывели в If. В результате наращивания функционала процедура выросла до 7000+ строк. Многие части почти идентичны. Условия вроде or (@parameter1 is Null and table.column = @parameter2) тормозят, но без них текста будет в разы больше. Любое мелкое изменение - пол дня тупой механической работы программиста на поиск и внесение правок во все ветки дерева.

Когда мне в очередной раз не выделили программиста, чтобы поправить процедуру, а заказчик требовал результата, попробовал дописать новые условия сам. Но я ленивый, копаться не стал, сразу писал в динамике, корявенько, но сработало на отлично. Динамические запросы дали возможность менять состав\порядок выполнения, всегда выполнять "минимальный" запрос (очищенный от условий, налагаемых вх. параметрами), быстро делать точечные исправления, быстро добавлять новые условия.
Сейчас систематизирую свой корявый код и переписываю те 7к строк, уже получается намного компактнее и прозрачнее.

Вы знаете более правильный путь?
21 апр 12, 23:48    [12451939]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
Agarez
Member

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

Что-то не получается, ругается:
Types don't match between the anchor and the recursive part in column "N" of recursive query "Results"
Types don't match between the anchor and the recursive part in column "N1" of recursive query "Results"

Хотя они вроде один-в-один приравниваются при рекурсии, без преобразований.
В чём может быть проблема?
22 апр 12, 00:15    [12451978]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Agarez
Вы знаете более правильный путь?

Да. Для быстрого выполнения запросов с варьирующимся числом условий и прочими параметрическими фишками очень полезна опция recompile. С условием вида or (@parameter1 is Null and table.column = @parameter2) и похожими эта опция справляется на ура.
22 апр 12, 00:17    [12451983]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
Agarez
Member

Откуда: Москва
Сообщений: 14
iljy, спасибо за информацию, беру на заметку.
Если я правильно понял, это поможет убрать тормоза, добавляемые проверкой параметров внутри запросов. Но остальные проблемы останутся: невозможность контролировать порядок выполнения и чрезмерная трудоёмкость модификации, т.к. объём кода сохранится.
22 апр 12, 00:35    [12452017]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Agarez
iljy, спасибо за информацию, беру на заметку.
Если я правильно понял, это поможет убрать тормоза, добавляемые проверкой параметров внутри запросов. Но остальные проблемы останутся: невозможность контролировать порядок выполнения и чрезмерная трудоёмкость модификации, т.к. объём кода сохранится.

Это позволит серверу строить план исходя из текущих значений параметров. Для тяжелых запросов потери на компиляцию могут с лихвой компенсироваться скоростью выполнения.
use tempdb
select number id, 'Object'+CAST(number as varchar) name into ttt
from master..spt_values
where type = 'p'
go 
create unique clustered index IX_ID on ttt(id)
go

declare @i int = 500

select * from ttt where @i is null or id = @i

select * from ttt where @i is null or id = @i option (recompile)
drop table ttt

Остальные проблемы решаются разбиением кода на представления и инлайн-функции. А необходимость контроллировать порядок выполнения в декларативном языке говорит о серьезных просчетах в проектировании.
22 апр 12, 00:48    [12452042]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
iljy
Member

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

чтобы направить мысли в нужном направлении - осознайте, что задача в стартовом посте, по сути, сводится к вызову инлайн-функции через cross apply. Т.е. ваш Base - это функция, подстроки-заменители - параметры, CASE - номер набора, для каждого из которых нужно осуществить вызов.
22 апр 12, 01:00    [12452046]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
Agarez
Member

Откуда: Москва
Сообщений: 14
iljy, если есть правильный путь, я готов по нему пойти, но как вынести всё это во вьюшки\функции не могу понять. Я не программист, возможно просто не до конца понимаю, о чём Вы говорите. Если не затруднит, поясните на примере:
Есть параметры
@p1 ... @p5
и запрос:
Select Src.Col1, T2.Col5
From Table1 Src
Inner join Table2 T2 on
<статичные условия>
 and T2.Col1 = 0
 and T2.Col2 between Src.Col1 and Src.Col2
Where
<статичные условия>
 and Exists (<что-нибудь1>)


В зависимости от параметров:
Параметр Значение - действие
@p1 0 - оставить как есть.
@p1 1 - заменить
and T2.Col1 = 0 
на
and T2.Col3 = @p5
@p2 0 - оставить
@p2 1 - заменить
and T2.Col2 between Src.Col1 and Src.Col2
на
inner join Table3 T3 on <что-нибудь2>
и добавить доп. условие после Where
@p3 0 - оставить
@p3 1 - заменить <что-нибудь1> на <что-нибудь ещё>
@p3 2 - заменить
exists
на
not exists
@p3 3 - вставить в <что-нибудь1> доп условие
@p4 0 - оставить
@p4 1 - если @p2 = 1 то добавить в <что-нибудь2> доп. условие


Под использованием представлений, как я понимаю, подразумевается вынесение остовного запроса, без параметрической части, во вьюшку. Но выполнение такого запроса:
Select *
From Table1 Src
Inner join Table2 T2 on
<статичные условия>
Where
<статичные условия>

Заставит сервер надолго задуматься, неважно во вьюшке или прямым текстом.
22 апр 12, 01:49    [12452102]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Agarez, а какая у вас редакция сервера?
В Enterprize (не знаю как в других редакциях) есть очень хороший механизм как StartupExpression (Filter Showplan Operator)
iljy, боже мой, а сколько много операторов появилось в Denali. Или я что-то пропустил?
Так вот, подставляя нужные управляющие параметры, вы можете включить/отключить ту или иную ветку плана.
Т.о. можно почти любую селективную процедуру превратить в функцию.
Это первое.

Второе, я не заставляю вас отказаться от динамики полностью. Просто не надо пихать всё в одну процедуру (уверен, 80% её кода Copy-Past), разбейте всё на маленькие логические блоки по функциям/представлениям. Процедура (если всё так запущено) пусть будет тем Main-ом собирая всё воедино, и с нужными управляющими OPTION-ами (аля OPTIMIZE FOR @Parameter = <OptimalTestValue>), если это надо.

Третье, стараться выявить и использовать хитрости/логику оптимизатора. К примеру: злоупотребление LEFT JOIN замест JOIN при наличии FK в представлениях. Тогда оптимизатор будет выкидывать обращение к таблице, если к её данным нет смысла обращаться, в зависимости от вида запроса к данной VIEW. Т.е. одно представление хорошо выполняет несколько задач.
Т.о. чем больше инструментов вы знаете, тем больше шансов решить задачу малой кровью и тем больше уверенности что было принято верное решение.

Это не панацеи, плохую архитектуру ничего не спасёт. Максимум отодвинет её смерть не некоторое время.
Поэтому в некоторых случаях без динамики может и не обойтись. Но в этом я не убеждался.

И главное, эти разные критерии означает одно - разные задачи. Зачем все пихать в одну процедуру? Обычно разные задачи, определяют разный интерфейс и/или обработку данных. Вполне может быть что и клиент и сервер имеет лишний кусок кода, только для того чтобы вызывать одну и туже процедуру. Это я не говорю про контроль безопасности.

Без iljy, я скорее всего остался в замешательстве, как мне кажется.
22 апр 12, 04:22    [12452184]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Agarez
Есть параметры
@p1 ... @p5
...
В зависимости от параметров:
[CSV] Параметр, Значение - действие
@p2, 0 - оставить
@p2, 1 - заменить
and T2.Col2 between Src.Col1 and Src.Col2
на
inner join Table3 T3 on <что-нибудь2>
и добавить доп. условие после Where

and ((@p2 = 0 and T2.Col2 between Src.Col1 and Src.Col2)
		or
	 (@p2 = 1 and exists (select * from Table3 T3 where <что-нибудь2>)
		and <доп. условие после Where>
	))


Agarez
Под использованием представлений, как я понимаю, подразумевается вынесение остовного запроса, без параметрической части, во вьюшку. Но выполнение такого запроса:
Select *
From Table1 Src
Inner join Table2 T2 on
<статичные условия>
Where
<статичные условия>

Заставит сервер надолго задуматься, неважно во вьюшке или прямым текстом.

Запрос всегда компилируется целиком, вместе со всеми условиями, не важно - во вьюшке они или прямым текстом.
22 апр 12, 10:26    [12452327]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
aleks2
Guest
Agarez
aleks2,

Что-то не получается, ругается:
Types don't match between the anchor and the recursive part in column "N" of recursive query "Results"
Types don't match between the anchor and the recursive part in column "N1" of recursive query "Results"

Хотя они вроде один-в-один приравниваются при рекурсии, без преобразований.
В чём может быть проблема?


results as (
	select String, [Case], cast(0 as bigint) as n1, cast(0 as bigint) as n  from main
22 апр 12, 13:44    [12452622]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
Agarez
Member

Откуда: Москва
Сообщений: 14
Mnior, редакцию не знаю, уточню в понедельник.


Работу с оптимизатором я ещё не освоил, буду читать. Насколько понимаю, мой программист тоже толком не умеет им пользоваться, иначе сделал бы всё изначально по уму.

Задача одна, все варианты запросов должны возвращать одно и то же: связку исходной записи с найденной. Методы привязки разнятся, т.к. данные поступают из разных неподконтрольных нам источников. Где-то дают более полные данные, где-то менее, состав бывает разный. Пляшем от того, что получаем. Интерфейс единый, для всех видов данных в нём одни и те же вещи делаются, по результатам привязки.
22 апр 12, 15:11    [12452762]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
Agarez
Member

Откуда: Москва
Сообщений: 14
iljy, значит я ошибался. Спасибо за пример. Если так, всё действительно можно попытаться раскидать по вьюшкам.

А в чём будет выйгрыш по сравнению с динамическими запросами? Процедура на вьюшках с recompile быстрее?
22 апр 12, 15:15    [12452771]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
Agarez
Member

Откуда: Москва
Сообщений: 14
aleks2, понятно. Интересно, а до этого он 0 как воспринимал? Как bit?
22 апр 12, 15:18    [12452777]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
aleks2
Guest
Agarez
aleks2, понятно. Интересно, а до этого он 0 как воспринимал? Как bit?

Умолчание = int.
22 апр 12, 17:01    [12452995]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
iljy
Member

Откуда:
Сообщений: 8711
Agarez
iljy, значит я ошибался. Спасибо за пример. Если так, всё действительно можно попытаться раскидать по вьюшкам.

А в чём будет выйгрыш по сравнению с динамическими запросами? Процедура на вьюшках с recompile быстрее?

Выигрыш будет в простоте отладки, написания, сопровождения кода, разграничения доступа - это что сходу в голову приходит. А так же устойчивости кода к ошибочным действиям пользователя, попыткам взлома (читайте про SQL injection). И да, с recompile должна быть не процедура, а сам запрос.
22 апр 12, 17:59    [12453092]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
Agarez
Member

Откуда: Москва
Сообщений: 14
По рекомендациям пытаюсь использовать функции. Не могу добиться от функций производительности. Если судить по плану запроса, использование функции добавляет TableSpool, который всё солидно замедляет.
Как от него избавиться?

Для примера использую:

Функция
CREATE FUNCTION ETSNGLadenCheck (@CodeETSNG int)
RETURNS TABLE 
AS
RETURN 
Select Case
When Exists (Select top 1 1 
                   From RefETSNG
		   Where ReferenceId = @CodeETSNG
		   and Code in (39146, 39147, 39148, 39149) ) Then 0
Else 1
End
As Result


Запрос с функцией
Select top 10000 FT.FactTransId, lc.result
from FactTransport FT
Cross apply ETSNGLadenCheck(FT.CodeETSNG) lc
Where lc.result = 1


Прямой запрос
Select top 10000 FT.FactTransId, FT.CodeETSNG
from FactTransport FT
left join RefETSNG RE on FT.CodeETSNG = RE.ReferenceId
Where RE.Code not in (39146, 39147, 39148, 39149) or FT.CodeETSNG is null
28 апр 12, 23:01    [12487218]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
Agarez
Member

Откуда: Москва
Сообщений: 14
Переписывал на разные лады, в итоге избавился от TableSpool, но проблема с производительностью осталась.
CREATE FUNCTION ETSNGLadenCheck (@CodeETSNG int)
RETURNS TABLE 
AS
RETURN 
Select CAse when @CodeETSNG in (Select ReferenceId from RefETSNG
Where Code in (39146, 39147, 39148, 39149)) then 0
else 1
end as result
GO


--Запрос с функцией
Select top 1 FT.Facttransid, FT.Codeetsng, LC.Result
From FactTransport FT
cross apply dbo.ETSNGLadenCheck(FT.CodeETSNG) LC
where LC.result = 0

--Без функции
Select top 1 FT.Facttransid, FT.Codeetsng,
Case
  When RE.Code in (39146, 39147, 39148, 39149) then 0
  Else 1
End as Result
From FactTransport FT
Left join RefETSNG RE on RE.ReferenceId = FT.CodeETSNG
Where RE.Code in (39146, 39147, 39148, 39149)


Планы - в приложенном файле. 20 миллионов это почти весь Facttransport. Зачем ему нужно перекапывать всю таблицу, не возьму в толк. Прямой запрос сразу находит 1 запись.

К сообщению приложен файл. Размер - 48Kb
29 апр 12, 01:29    [12487592]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Facepalm.jpg

Вы не поняли. Нужно не использовать путём бесполезного нагромождения функций. Я тогда просто уточнил мелочь, что вместо одной конечной процедуры можно написать одну конечную функцию. Ту которую вызывает клиент.
А вот что и как она использует нужно сильно подумать. Не надо нагромождать представления и функции абы как. Обычно вдоль иерархии представлений абстракция дополняется новыми элементами или линейными условиями. По вышеописанному принципу.

В вашем случае функция ETSNGLadenCheck бессмысленна. В нём свойство сущности от него отделено в отдельной функции.
Представление (неважно, параметризованное оно или нет) представляет объект, целиком. Свойство предоставляет колонка.

Но здесь всё по другому. ETSNGLaden это некоторая группа объектов, а не их свойства. И более того это группа сумма нескольких групп.
Можно суммировать или через UNION или через GROUP BY:
CREATE VIEW [dbo].[ETSNGLaden] AS
	SELECT	R.ReferenceId	AS CodeETSNG
	FROM	dbo.RefETSNG	R
	WHERE	R.Code = 39146
UNION
	SELECT	R.ReferenceId
	FROM	dbo.RefETSNG	R
	WHERE	R.Code = 39147
UNION
	SELECT	R.ReferenceId
	FROM	dbo.RefETSNG	R
	WHERE	R.Code = 39148
UNION
	SELECT	R.ReferenceId
	FROM	dbo.RefETSNG	R
	WHERE	R.Code = 39149
UNION
	SELECT	R.ReferenceId
	FROM	dbo.RefETSNG	R
	WHERE	R.Code = 39147, 39148, 39149)
GO
CREATE VIEW [dbo].[ETSNGLaden] AS
SELECT	R.ReferenceId	AS CodeETSNG
FROM	dbo.RefETSNG	R
WHERE	R.Code BETWEEN 39146 AND 39149 -- IN (39146, 39147, 39148, 39149)
GROUP BY R.ReferenceId
GO
А далее так:
SELECT	Top(10000)
	 FT.FactTransId
	,FT.CodeETSNG
FROM	     dbo.FactTransport	FT
	JOIN dbo.ETSNGLaden	EL ON EL.CodeETSNG = FT.CodeETSNG
-- WHERE @Param = 1

SELECT	Top(10000)
	 FT.FactTransId
	,FT.CodeETSNG
FROM	dbo.FactTransport	FT
WHERE	Exists(SELECT * FROM dbo.ETSNGLaden EL WHERE EL.CodeETSNG = FT.CodeETSNG) -- AND @Param = 1

SELECT	Top(10000)
	 FT.FactTransId
	,FT.CodeETSNG
FROM	dbo.FactTransport	FT
WHERE	NOT Exists(SELECT * FROM dbo.ETSNGLaden EL WHERE EL.CodeETSNG = FT.CodeETSNG) -- AND @Param = 0


И последнее, имеет ли смысл отделять это в отдельный объект. Если оно используется только в конечной main функции? Где оно лишь один из её элементов UNION ALL.

PS: Главное чуть не забыл: всегда пишите схему объекта (dbo.ETSNGLadenCheck), даже под страхом смерти. И второе - везде пишите схему объекта. Ну и третье, при любых обстоятельствах всегда и везде пишите схему объекта.
29 апр 12, 04:07    [12487729]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать множественные подстановки в массиве строк без курсора?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
PPS: Agarez, эта ваша функция ETSNGLadenCheck ломает мне мозг в стиле:
А за окном шёл снег и рота красноармейцев
Синтаксически верное, но семантически мало полезное построение, с моей точки зрения.
29 апр 12, 04:25    [12487731]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить