2013-06-27 5 views
1

이것은 아마도 간단한 질문 일 수 있지만 저장 프로 시저를 트리거하는 "사전 이벤트"가있는 보고서를 실행해야합니다. 프로 시저에서 데이터를 반환하지 않고 ISAM 데이터베이스에서 내 보낸 .csv 파일에서 BULK INSERT를 수행하여 데이터웨어 하우스에서 2 개의 테이블을 업데이트합니다. 보고서 자체는 별도의 쿼리를 사용하여 SQL Server 테이블에서 가져 오지만 가져온 데이터는 여러 보고서에서 궁극적으로 사용되므로 테이블을 실제로 업데이트해야합니다.ssrs 보고서 시작시 SQL Server 저장 프로 시저를 트리거해야 함

저장 프로 시저는 일반 루틴의 일부로 밤에 실행되지만이 특정 보고서에 영향을주는 데이터는 사용자가 업데이트하고 보고서를 실행하기 직전에 생성 된 새로운 .csv 추출물이므로 보고서가 저장된 루틴을 실행해야합니다 프로 시저를 사용하여 테이블 자체를 쿼리하기 전에 테이블을 업데이트하십시오.

검색을 시도했지만 모든 참조가 저장 프로 시저를 보고서 쿼리로 사용하는 데 집중하는 것처럼 보입니다. 이는 수행하려는 작업이 아닙니다. 필자는 데이터를 가져 오기위한 별도의 쿼리를 가지고 있으며, 저장 프로 시저를 추가로 실행하고 보고서 쿼리를 선행해야합니다.

저장 프로 시저를 내 보고서 쿼리의 시작 줄로 트리거하는 방법을 아는 사람 있습니까?

미리 아이디어를 제공해 주셔서 감사합니다. 나는 SQL 프로그래머 (또는 어떤 종류의 프로그래머, 정말로)가 아니므로 당신의 충고와 관련하여 구체적으로 설명하십시오 ... 내 지식에 대한 기존의 기반을 추측하는 고차원 개념은 아마 저에게 상실 될 것입니다.

이 그 도움이된다면 내가 쓴 저장 프로 시저 (dbo.KCSI.DataUpdate) ...

--To run as a script (query) the following 2 lines should be un-commented (there are 3 of these 'run-as-a-script' comments to find) 
--USE KCSI 
--Go 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

-- To run as a script (query) the following 3 lines should all be commented out 
CREATE PROCEDURE DataUpdate 
AS 
BEGIN 

SET NOCOUNT ON 

-- Declare all the needed variables. 
DECLARE @CustFile varchar(255) 
DECLARE @CustFile_Exists int 
DECLARE @HistFile varchar(255) 
DECLARE @HistFile_Exists int 
DECLARE @dt varchar(30) 
DECLARE @NewCustName varchar(250) 
DECLARE @NewHistName varchar(250) 

-- Sets Boolean value for whether or not each file exists, using T-SQL extended (i.e. DOS Shell) command 
SELECT @CustFile='C:\transfer\ecallcust.csv' 
EXEC Master.dbo.xp_fileexist @CustFile, @CustFile_Exists OUT 

SELECT @HistFile='C:\transfer\ecallhist.csv' 
EXEC Master.dbo.xp_fileexist @HistFile, @HistFile_Exists OUT 

-- Sets a date variable to append to the final file name 
SELECT @dt = REPLACE(Convert(varchar(30),getdate(),120),':','_') 
-- Sets a variable to hold the final name. Variable use required because of the hybrid nature of the name (dos shell command + SQL variable) 
SET @NewCustName = 'RENAME C:\transfer\history\ecallcust2.csv "ecallcust_'[email protected]+'.csv"' 
SET @NewHistName = 'RENAME C:\transfer\history\ecallhist2.csv "ecallhist_'[email protected]+'.csv"' 

-- Subroutine runs only if ecallcust.csv is present 
IF @CustFile_Exists = 1 
BEGIN 

--Zaps the table 
TRUNCATE TABLE custextract 
-- Initially renames the file, using T-SQL extended (i.e. DOS Shell) command 
EXEC master.dbo.xp_cmdshell 'RENAME C:\transfer\ecallcust.csv ecallcust2.csv' 

-- Update table from CSV file 
BULK INSERT custextract 
FROM 'c:\transfer\ecallcust2.csv' 
WITH (
ROWTERMINATOR='\n' 
) 

-- Move file to the history directory and rename it to include the date-time stamp using T-SQL extended (i.e. DOS Shell) command 
EXEC master.dbo.xp_cmdshell 'MOVE C:\transfer\ecallcust2.csv C:\transfer\history\' 
EXEC master.dbo.xp_cmdshell @NewCustName 

END 

-- Subroutine runs only if ecallhist.csv is present 
IF @HistFile_Exists = 1 
BEGIN 

--Zaps the table 
TRUNCATE TABLE histextract 
-- Initially renames the file, using T-SQL extended (i.e. DOS Shell) command 
EXEC master.dbo.xp_cmdshell 'RENAME C:\transfer\ecallhist.csv ecallhist2.csv' 

-- Update table from CSV file 
BULK INSERT histextract 
FROM 'c:\transfer\ecallhist2.csv' 
WITH (
ROWTERMINATOR='\n' 
) 

-- Move file to the history directory and rename it to include the date-time stamp using T-SQL extended (i.e. DOS Shell) command 
EXEC master.dbo.xp_cmdshell 'MOVE C:\transfer\ecallhist2.csv C:\transfer\history\' 
EXEC master.dbo.xp_cmdshell @NewHistName 

END 

-- To run as a script (query) the following line should be commented out 
END 
GO 

및 보고서 쿼리 ...

WITH OrderedYTD AS 
(
SELECT custextract.*, histextract.*, 
     ROW_NUMBER() OVER (PARTITION BY custextract.custcustno ORDER BY histextract.salesytd desc) AS RowNumber 
FROM custextract 
INNER JOIN histextract 
    ON custextract.custcustno = histextract.histcustno 
WHERE (custextract.ecall = 'Y') 
) 

SELECT OrderedYTD.* 
FROM OrderedYTD 
WHERE RowNumber <= 10; 

답변

3

하나의 저장 프로 시저를 작성하고, 먼저 데이터를 업데이트 한 다음 보고서에서로드 할 새로 고친 데이터를 반환합니다. ...

CREATE PROCEDURE DataSelect 
AS 
BEGIN 

    -- Refresh Data Here 
    EXEC DataUpdate 

    -- Select Data for Report 
    WITH OrderedYTD AS 
    (
     SELECT custextract.*, histextract.*, 
    ROW_NUMBER() OVER (PARTITION BY custextract.custcustno ORDER BY histextract.salesytd desc) AS RowNumber 
     FROM custextract 
     INNER JOIN histextract 
      ON custextract.custcustno = histextract.histcustno 
     WHERE (custextract.ecall = 'Y') 
    ) 

    SELECT OrderedYTD.* 
    FROM OrderedYTD 
    WHERE RowNumber <= 10; 

END 
+0

우수! 그런 다음 지금 사용하는 쿼리 대신 저장 프로 시저 만 사용하도록 보고서를 변경할 수 있습니까? 윌슨이 보고서를 다시 만들게할까요? 모든 질문에 대해 유감스럽게 생각하지만 일반적으로 갑자기 디자이너 업무를 수행하는 네트워크 기술자입니다. 이 후에도 웹 페이지에서 제공하는 입력 매개 변수를 "저장"하여 필터링하고 완성 된 보고서를 동적 .pdf (디스크에 저장되지 않음)로 반환하는 입력 매개 변수를 허용하도록 수정하는 방법을 알아 내야합니다 그들의 브라우저에서 로컬로 인쇄 할 수 있습니다. 나는 지금까지 6 일간 내 머리카락을 꺼내왔다. –

+0

예, select 대신 sp를 호출하도록 보고서를 변경해야하지만 새 sp가 낡은 선택을하면 더 많은 변경 작업을 수행 할 필요가 없습니다. 다른 itens는 너무 쉽게 구현해야합니다. 그렇지만 다른 문제를 만들면 ... :) –

+0

감사합니다! 매우 간결하고 쉽게 이해할 수있는 답. 정말 도움을 주셔서 감사합니다! –

관련 문제