2012-06-04 3 views
0

Я создал запрос, просматривающий информацию о транзакции. Критерий периода времени является условным - 5-го числа месяца он должен смотреть на дни 16-последний день предыдущего месяца. 20-го числа месяца нужно посмотреть дни 1-15 того же месяца. Он будет работать автоматически. Прекрасный джентльмен или женщина на Stack Overflow дала мне следующую хранимую процедуру для использования, который работал отлично:Альтернатива вызову хранимой процедуры в представлении?

DECLARE @today SMALLDATETIME, @start SMALLDATETIME, @end SMALLDATETIME; 
SET @today = DATEADD(DAY, 0, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP)); 

SET @start = DATEADD(DAY, 1-DAY(@today), @today); 
SET @end = DATEADD(DAY, 15, @start); 

IF DATEPART(DAY, @today) <= 15 
BEGIN  
    SET @start = DATEADD(MONTH, -1, @end);  
    SET @end = DATEADD(DAY, 1-DAY(@today), @today); 
END 

SELECT ... WHERE h.billed_date >= @start AND h.billed_date < @end; 

Теперь они хотят это превращено в мнение, что они могут получить доступ из данных сторонних инструментов 3 интеграции. Google сообщает, что представления не могут вызывать хранимые процедуры в SQL Server. Их администратор базы данных сказал, что весь запрос может быть также преобразован в хранимую процедуру. Как преобразовать запрос в SP так, чтобы к нему можно было получить доступ с помощью инструмента интеграции данных? Вот упрощенная версия запроса.

SELECT 
    c.customer_name 
, cc.category_name 
, h.acct_bal 

FROM 
customer c 
inner join htransactions h on c.customer_id = h.customer_id 
left outer join customer_category cc on cc.category_id = c.category_id 

WHERE 
h.billed date >= @start 
AND h.billed date < @end 

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

+0

, и данные партий инструмента 3rd интеграции не может вызвать хранимую процедуру? Я бы не назвал такую ​​большую часть инструмента интеграции данных. –

+0

Является ли это хранимой процедурой вместо представления только потому, что вы присваиваете переменные '@ start' и' @ end' символом 'IF' ?, или есть еще одна причина? – Lamak

+0

Нет, он может определенно вызвать хранимую процедуру. –

ответ

1

Если это просто должно быть хранимая процедура, то:

CREATE PROCEDURE dbo.PullData -- whatever 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @today SMALLDATETIME, @start SMALLDATETIME, @end SMALLDATETIME; 

    SET @today = DATEADD(DAY, 0, DATEDIFF(DAY, 0, CURRENT_TIMESTAMP)); 

    SET @start = DATEADD(DAY, 1-DAY(@today), @today); 
    SET @end = DATEADD(DAY, 15, @start); 

    IF DATEPART(DAY, @today) <= 15 
    BEGIN  
     SET @start = DATEADD(MONTH, -1, @end);  
     SET @end = DATEADD(DAY, 1-DAY(@today), @today); 
    END 

    SELECT ... WHERE h.billed_date >= @start AND h.billed_date < @end; 
END 
GO 
Смежные вопросы