2014-01-09 79 views
0

我有下面的代碼正在檢查物理文件計數,以確認先前的過程中產生的文件的正確數量(在不同的文件夾)從Dyanmic SQL查詢返回一個變量

set NOCOUNT ON 

declare @DateOffset int 

set @DateOffset=0 

-- Create a table variable to store user data 
DECLARE @myTable TABLE 
(
    docID INT IDENTITY(1,1), 
    docRef VARCHAR(10), 
    YPTMPID varchar(3), 
    saveDir VARCHAR(500), 
    totalLettersExpected int, 
    actualLetters int 
); 

insert @myTable SELECT docRef, YPTMPID, 
    saveDir=max(Save_Directory) + cast(YEAR(GETDATE()[email protected]) as varchar(4)) + '\' + datename(month, GETDATE()[email protected]) + '\'+SUBSTRING(CONVERT(CHAR(20), GETDATE()[email protected], 101),4, 2) + '.' + LEFT(CONVERT(CHAR(20), GETDATE()[email protected], 101), 2) 
    + '.' + SUBSTRING(CONVERT(CHAR(20), GETDATE()[email protected], 101),7, 4), 
    COUNT(*) as 'Total Letters', null 
    FROM [alpsMaster].[dbo].[uExtractMonitor] 
    group by docRef, YPTMPID 
    order by 1,2 



-- Get the number of rows in the looping table 
DECLARE @RowCount INT, @SQL nvarchar(4000), @LoopSQL nvarchar(4000), @Date varchar(20) 

set @Date=rtrim(CONVERT(CHAR(12), getDate()[email protected], 106)) --'29 Oct 2013' 
SET @RowCount = (SELECT COUNT(docID) FROM @myTable) 

-- Declare an iterator 
DECLARE @I INT 

-- Initialize the iterator 
SET @I = 1 

-- Loop through the rows of table @myTable, and for each docRef, check the file directory for the correct number of files 
WHILE (@I <= @RowCount) 
    BEGIN 
     DECLARE @docRef VARCHAR(10), @saveDir VARCHAR(500), @TemplateID varchar(3), @letterCount int 
     DECLARE @statement nvarchar(200), @EQRecordCout int 

     -- Get the data from table and set to variables 
     SELECT @docRef = docref FROM @myTable WHERE docID = @I 
     SELECT @saveDir = saveDir FROM @myTable WHERE docID = @I   
     SELECT @TemplateID = YPTMPID FROM @myTable WHERE docID = @I 

     update @myTable set actualLetters = 0 where [email protected] 

     create table #files (subdirectory varchar(100), depth int, [file] int) 
     insert into #files EXEC master.sys.xp_dirtree @saveDir,0,1;  

     -- *** PROBLEM HERE *** 
     set @statement= 'SELECT count(*) FROM BOCTEST.S653C36C.LIVEBOC_A.' + @docRef 
     print @statement 

     exec @EQRecordCout=sp_executesql @statement 
     print @EQRecordCout 

     select @letterCount = COUNT(*) from #files 
     print cast(@letterCount as char(3)) + ' files for ' + @docRef 
     drop table #files 
     update @myTable set actualLetters = @letterCount where [email protected] and [email protected] 

     -- Increment the iterator 
     SET @I = @I + 1   

END 

select * from @myTable 

set NOCOUNT OFF 

在我的最後WHILE LOOP我想使用動態SQL來獲取iSeries遠程服務器上每個文件中的記錄數(動態SQL字符串結尾的表名爲docRef

但即使它執行的很好,進入變量@EQRecordCout是零。這是不正確的,雖然有些表是空的,大多數都有記錄

寫這個返回值的正確方法是什麼?

set @statement= 'SELECT count(*) FROM BOCTEST.S653C36C.LIVEBOC_A.' + @docRef 
print @statement 

exec @EQRecordCout=sp_executesql @statement 
print @EQRecordCout 

感謝 菲利普

回答

1

您需要使用output參數與sp_Executesql這樣

DECLARE @intCount int 
SET @statement = 'SELECT @numRecords = count(*) FROM BOCTEST.S653C36C.LIVEBOC_A.' + @docRef 
EXEC sp_Executesql @statement, N'@numRecords int output', @intCount OUTPUT 
PRINT @intCount 

入住這裏:Extract value returned from dynamic SQL

+0

謝謝,你在我做之前就提交了你的答案! –

1

你可以使用sp_executesqloutput參數。請記住要指定output兩次:

set @statement= 'SELECT @rc = count(*) FROM BOCTEST.S653C36C.LIVEBOC_A.' + @docRef 

declare @rc int 
exec sp_executesql @statement, N'@rc int output', @rc output; 
+0

謝謝我通過做一些研究到達那裏,但答案中的代碼更易於閱讀! –

0

我找到了答案在MS TechNet庫Microsoft Technet: sp_executesql (Transact-SQL)

這裏是WHILE LOOP代碼工作:

WHILE (@I <= @RowCount) 
    BEGIN 
     DECLARE @docRef VARCHAR(10), @saveDir VARCHAR(500), @TemplateID varchar(3), @letterCount int 
     DECLARE @statement nvarchar(200), @EQRecordCount int 
     DECLARE @ParmDefinition nvarchar(500); 

     -- Get the data from table and set to variables 
     SELECT @docRef = docref FROM @myTable WHERE docID = @I 
     SELECT @saveDir = saveDir FROM @myTable WHERE docID = @I   
     SELECT @TemplateID = YPTMPID FROM @myTable WHERE docID = @I 

     update @myTable set actualLetters = 0 where [email protected] 

     create table #files (subdirectory varchar(100), depth int, [file] int) 
     insert into #files EXEC master.sys.xp_dirtree @saveDir,0,1;  

     SET @ParmDefinition = N'@EQRecordCountOUT int OUTPUT'; 
     set @statement= 'SELECT @EQRecordCountOUT=count(*) FROM BOCTEST.S653C36C.LIVEBOC_A.' + @docRef 
     --print @statement 

     execute sp_executesql @statement,@ParmDefinition, @[email protected] OUTPUT; 
     print @EQRecordCount 

     select @letterCount = COUNT(*) from #files 

     drop table #files 
     update @myTable set actualLetters = @letterCount, [email protected] where [email protected] and [email protected] 

     -- Increment the iterator 
     SET @I = @I + 1   
    END 

select * from @myTable 

因此有必要通過在你想要填充到變量中的OUTPUT參數中。