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

Откуда:
Сообщений: 271
..невозможно. Как вариант - при помощи функции.
Но есть такой запрос, и может есть наиболее простой способ подключиться с екселя для получение данного набора данных?
CREATE VIEW ROO AS
(
DECLARE @datefrom date,@datetill date
SET @datefrom = dateadd(day,1-day(convert(char(8),getdate()-1,112)),convert(char(8),getdate()-1,112)) -- первый день месяца на вчерашнюю дату
SET @datetill = convert(char(8),getdate()-1,112);  -- дата на вчера

DECLARE @lb TABLE (mask1 NVARCHAR(100),name NVARCHAR(100));
INSERT @lb (mask1,name) VALUES   
  (N'B', N'ЦО'),
  (N'B1', N'1'),
  (N'B2', N'2'),
  (N'B3', N'3');
DECLARE @banc TABLE (mask1 NVARCHAR(100),name NVARCHAR(100));
INSERT @banc (mask1,name) VALUES 
  (N'%банк_А%',        N'А'),
  (N'%банк_B%',           N'B'),
  (N'%банк_C%',          N'C');

SELECT 
   'Тип_показателя' = 'Факт'
    ,z.День
	,z.РУ
	,isnull(y.name,'Другие')as'Банк'
	,z.Платежи
FROM( 
  SELECT 
    day(t.[DatePosting]) as 'День'
   ,b.name as 'РУ'
   ,t.external
   ,sum (t.[76]) as 'Платежи'
  FROM [data].[dbo].[76]  t
	   inner join @lb b on t.lb3=b.mask1
  WHERE t.lb1 in (N'B') and (t.[DatePosting] between @datefrom and @datetill)
  GROUP BY 
    day(t.[DatePosting])
   ,t.external
   ) z left join @banc y on z.external LIKE y.mask1

даты можно dписать в сам запрос, но как с временными таблицами? создавать их в базе и к ним джойниться?
1 фев 15, 21:11    [17203527]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
apply / join + union all
1 фев 15, 21:14    [17203536]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
2viper2viper
как с временными таблицами? создавать их в базе и к ним джойниться?
Можно в базе, можно тоже в сам запрос (в виде подзапроса)
select *
from (VALUES 
  (N'%банк_А%', N'А'),
  (N'%банк_B%', N'B'),
  (N'%банк_C%', N'C')) as bank (mask1,name) 
1 фев 15, 21:19    [17203550]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
alexeyvg, удобный вариант, минимум корректировок запроса
Спасибо за помощь
1 фев 15, 21:26    [17203572]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
может это излишки, но предела совершенству ведь нет..)
данные в базе будут обновляться в воскресенье. работать с ексель-файлом будут пн-пт, ежедневно будет происходить обновление связей (есть другие подключения кроме этого).
было бы отлично, чтобы при запуске обновления сначала происходило сравнение, и если текущий день - понедельник - скрипт выполнялся, иначе просто завершалось выполнение (и процесс выполнения переходил на следующее подключение).
Разгрузил бы сервер немного
Но конструкцию в таком виде в представление не пропишешь
IF datepart(weekday,getdate()) = 1
   BEGIN
  set скрипт  --
   END

Подскажи пожалуйста, как можно решить задачу?
2 фев 15, 00:13    [17204012]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Ну так вставьте эту конструкцию перед выборкой из вашего представления.
2 фев 15, 00:15    [17204017]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
ругается на IF

CREATE VIEW BANCASSUROO AS
(IF datepart(weekday,getdate()) = 1
   BEGIN
SELECT 


если так, то у меня в запросе много одинарных кавычек, и снова трабл

IF datepart(weekday,getdate()) = 1
   BEGIN EXECUTE('
CREATE VIEW BANCASSUROO AS
(
SELECT 
   'Тип_показателя' = 'Факт'
    ,z.День


здесь вроде есть решение, но мне нужно чтобы представление выполнялось в понедельник, а не создавалось. или я что-то не правильно понимаю..
2 фев 15, 00:34    [17204067]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
2viper2viper
Но конструкцию в таком виде в представление не пропишешь
IF datepart(weekday,getdate()) = 1
   BEGIN
  set скрипт  --
   END

Подскажи пожалуйста, как можно решить задачу?
В запросе IF меняйте на CASE
2 фев 15, 00:36    [17204069]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
2viper2viper
если так, то у меня в запросе много одинарных кавычек, и снова трабл
А, или вам нужно, что бы представление можно было создавать этим скриптом только в понедельник, а в другие дни скрипт ничего бы не делал?
Тогда в строке EXECUTE нужно менять все одинарные кавычки на 2 одинарных кавычки.

Но вообще задача у вас странная.
Вы, похоже, не понимаете, что такое представление. Или не можете рассказать, что вам на самом деле нужно.
2 фев 15, 00:39    [17204076]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
alexeyvg, все проще) представление нужно создать раз, но чтобы оно выполнялось только в понедельник.
Есть ексель файл свода. к файлу настроено несколько подключений к разными представлениям бд. данные в этих таблицах обновляются ежедневно.
при открытии файла ексель происходит обновление связей.
но представление с этого топика выгружает данные с таблицы, которая обновляется по воскресеньям, поэтому появилась идея разгрузить сервер во все другие дни недели, чтобы именно это представление не выполнянось во вт-вс. а другие представления продолжали выполняться ежедневно
2 фев 15, 00:50    [17204092]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
2viper2viper
alexeyvg, все проще) представление нужно создать раз, но чтобы оно выполнялось только в понедельник.
Стало сложнее, а не проще.

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

"Программа Excel написана один раз, но выполнять её нужно только в понедельник." Вам понятно? :-)

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

Представление нужно создать один раз, выполняться (использоваться) оно будет каждый день, но кроме понедельника, в другие дни, оно не должно возвращать данные?

Тогда добавьте в конец запроса, в условие WHERE t.lb1 in ... ещё одно условие:
and datepart(weekday,getdate()) = 1
2 фев 15, 02:28    [17204160]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
гр к
Guest
2viper2viper
alexeyvg, все проще) представление нужно создать раз, но чтобы оно выполнялось только в понедельник.
Есть ексель файл свода. к файлу настроено несколько подключений к разными представлениям бд. данные в этих таблицах обновляются ежедневно.
при открытии файла ексель происходит обновление связей.
но представление с этого топика выгружает данные с таблицы, которая обновляется по воскресеньям, поэтому появилась идея разгрузить сервер во все другие дни недели, чтобы именно это представление не выполнянось во вт-вс. а другие представления продолжали выполняться ежедневно

Почему бы не отойти от представлений и использовать в качестве исходных данных для экселя хранимую процедуру?
2 фев 15, 08:30    [17204357]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
alexeyvg, может не точно сформулировал, но подумал что на реальном примере смогу объяснить более понятно)
имел ввиду чтобы после проверки дня недели, на этом этапе выполнения представления , выполнение или продолжалось, если день недели -1 , или прекращалось, во всех других случаях. таким образом, для вт-вс нагрузка на сервер будет ограничена только расчетом дня недели
2 фев 15, 09:50    [17204587]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
2viper2viper
alexeyvg, может не точно сформулировал, но подумал что на реальном примере смогу объяснить более понятно)
имел ввиду чтобы после проверки дня недели, на этом этапе выполнения представления , выполнение или продолжалось, если день недели -1 , или прекращалось, во всех других случаях. таким образом, для вт-вс нагрузка на сервер будет ограничена только расчетом дня недели
Ага, понятно, ну тогда с WHERE

Или ещё лучше прислушайтесь к:
гр к
Почему бы не отойти от представлений и использовать в качестве исходных данных для экселя хранимую процедуру?
если это несложно из экселя. С процедурами работать проще, это именно выполняемый код.
2 фев 15, 10:03    [17204674]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
грязный комплектовщик
Member

Откуда: екб
Сообщений: 130
alexeyvg
...
Или ещё лучше прислушайтесь к:
гр к
Почему бы не отойти от представлений и использовать в качестве исходных данных для экселя хранимую процедуру?
если это несложно из экселя. С процедурами работать проще, это именно выполняемый код.

Вроде что вью, что хранимка (без передачи параметров с листа) как источник данных - для экселя без разницы.
Но это лучше на профильном форуме уточнить
https://www.sql.ru/forum/ms-office
ЗЫ Сейчас тестовую хранимку написал типа select * from table. В MS Query забил ее как источник - отработало ок.
2 фев 15, 11:17    [17205178]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
наверно действительно реализую через хранимку.
Спасибо за идеи и помощь :)
отпишусь как получилось
2 фев 15, 13:01    [17206053]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
Если нужно параметризованное представление, пишите функцию, а не процедуру.
Функцию, как минимум, можно будет использовать в запросах.
2 фев 15, 13:33    [17206346]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
2viper2viper
Member

Откуда:
Сообщений: 271
сделал через хранимую процедуру, к которой приконектился с excel.
здесь инструкция.
Но в результате, если конструкция if возвращает ЛОЖЬ, при обновлении связей появляется ошибка в самом екселе, т.к. он не может получить ни одной строки.
Поэтому в esle логично добавить таблицу, которая будет соответствовать полям с основного запроса.
Но здесь закралась проблема - если пропишу нулевые строки, тогда обнулится кеш в екселе.
А нужно чтобы полученные в прошлый понедельник данные фиксировались на протяжении вт-вс, и обновлялись только в след пн.
Наверное, тупиковая сама задача при данных средствах реализации..
5 фев 15, 21:54    [17225331]     Ответить | Цитировать Сообщить модератору
 Re: DECLARE in VIEW..  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31444
2viper2viper
Но здесь закралась проблема - если пропишу нулевые строки, тогда обнулится кеш в екселе.
А нужно чтобы полученные в прошлый понедельник данные фиксировались на протяжении вт-вс, и обновлялись только в след пн.
Нужно искать, как управлять кешем в экселе, наверное, это как то возможно? Наверняка прописывается где то в описании источника, запроса и т.п.
6 фев 15, 00:41    [17225835]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить