2016-07-22 5 views
0

У меня динамический запрос, который я написал, что выглядит следующим образом:Использование динамического синтаксиса в представлении или функции

DECLARE @sql nvarchar(max) 


SELECT @sql = 
'select distinct datetable.Date 
from (
select cast(DATEADD(day,-(a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a)),getdate()) as date) AS Date 
from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a 

cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b 

cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c 

cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d 

union all 

select cast(DATEADD(day,(a.a + (10 * b.a) + (100 * c.a) + (1000 * d.a)),getdate()) as date) AS Date 
from (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as a 

cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as b 

cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as c 

cross join (select 0 as a union all select 1 union all select 2 union all select 3 union all select 4 
union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) as d 
) datetable 
where ' 
+ 
replace(replace(replace(stuff((SELECT ' or datetable.Date between cast(''' + cast(cast(hld1.StrDate as date) as nvarchar(12)) + N''' as date) and cast(''' + cast(cast(hld1.endDate as date) as nvarchar(12))+ N''' as date) 
' 

from hld1 for xml path('')),1,3,''), '&lt;', '<'), '&gt;', '>'), '&#x0D;', char(13)) + 
'order by datetable.Date ' 


--print @sql 
EXEC sys.sp_executeSQL @SQL 

HLD1 список праздников, где каждый праздник имеет начало и конец Дата. Сам запрос возвращает список дат, которые определяются как праздники. (Причина, по которой я не могу просто выбрать даты начала и объединить их к датам окончания, заключается в том, что в течение трех дней может быть очень большой праздник, а средний день не будет отображаться в любом списке.

Тем не менее, я использую это чудовище для создания функции, и, как часть функции, я хочу иметь возможность сделать что-то вроде «Если дата в этом списке, сделайте следующее».

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

Следующей мыслью было создать функция, которая просто вернет список. Howe ver, когда я поставил в синтаксис, чтобы создать его как функцию, я получаю ошибку The last statement included within a function must be a return statement.

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

Если вам нужно больше информации/информации, пожалуйста, сообщите мне, и я буду рад предоставить. Я просто учился, когда я ухожу. :)

Edit 1: Я нашел ссылку, но он не появляется, чтобы применить в данном случае: Create A View With Dynamic Sql

+0

Возможно, вам стоит опубликовать таблицу hld1. Определение таблицы и несколько строк выборочных данных должно быть достаточным. Наряду с этим объяснение того, что вы пытаетесь сделать, поможет. На данный момент я просто не могу понять, что вам нужно сделать. –

ответ

1

Почему бы не просто создать номера или учетный стол в качестве постоянной таблицы или представления и избежать вся эта гадость. 99% этого запроса просто генерируют кучу чисел.

Например, вот представление, которое выполняет 0 считываний и будет генерировать 10 000 строк последовательных чисел почти мгновенно.

create View [dbo].[cteTally] as 

WITH 
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)), 
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows 
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max 
    cteTally(N) AS 
    (
     SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4 
    ) 
select N from cteTally 
GO 

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

Вот потрясающая статья из моих друзей Dwain Camps (RIP) о создании таблицы календаря. http://www.sqlservercentral.com/blogs/dwainsql/2014/03/30/calendar-tables-in-t-sql/

--EDIT--

Ниже приведен пример того, чтобы иметь таблицу (#Something) с даты начала и окончания для отдыха. При этом будет отображаться каждая дата между этими двумя датами. Если я не пропущу что-то, это должно быть в значительной степени тем, что вы пытаетесь сделать.

create table #Something 
(
    HolidayName varchar(10) 
    , StartDate date 
    , EndDate date 
) 

insert #Something 
select 'phroureo', '2016-03-01', '2016-03-05' union all 
select 'Sean', '2016-07-04', '2016-07-05' 

select HolidayName 
    , StartDate 
    , EndDate 
    , DATEADD(day, t.N - 1, StartDate) as ResultDate 
from #Something s 
join cteTally t on t.N <= DATEDIFF(day, StartDate, EndDate) + 1 
order by HolidayName 

drop table #Something 
+0

Я не уверен, как это полезно - мне все же придется создавать функцию с каким-то динамическим SQL, а для создания числа/даты уже требуется меньше секунды. – phroureo

+0

Я мог бы просто быть глупым, поэтому, если я не пойму тебя, пожалуйста, дайте мне знать.:) Кроме того, причина, по которой таблица «Календарь» невозможна, связана с тем, что SAP (программное обеспечение, которое мы используем) работает с таблицей HLD1. Для пользователей обновлен пользовательский интерфейс. Я считаю, что на самом деле я действительно прочитал эту статью в своем поиске и решил, что она не будет делать то, что мне нужно. :( – phroureo

+0

Я действительно не понимаю, зачем вам нужен динамический sql. Код, который вы опубликовали, настолько подробный и полный повторяющихся вещей, что трудно сказать, что делает ваш запрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^