Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 不返回值的存储过程_Sql_Sql Server 2008_Stored Procedures - Fatal编程技术网

Sql 不返回值的存储过程

Sql 不返回值的存储过程,sql,sql-server-2008,stored-procedures,Sql,Sql Server 2008,Stored Procedures,我创建了一个存储过程,它采用UNC路径,根据日期附加子文件夹字符串,然后执行xp_cmdshell'Dir'检查目录中有多少文件 不幸的是,它似乎没有向我调用的sql返回值 以下是存储过程: create procedure getDirFileCount ( @sUNCPath Varchar(500), @countFiles int OUTPUT ) AS BEGIN declare @files table (ID int IDENTIT

我创建了一个存储过程,它采用UNC路径,根据日期附加子文件夹字符串,然后执行xp_cmdshell'Dir'检查目录中有多少文件

不幸的是,它似乎没有向我调用的sql返回值

以下是存储过程:

create procedure getDirFileCount (
    @sUNCPath Varchar(500),
    @countFiles int OUTPUT
    )

AS
    BEGIN
        declare @files table (ID int IDENTITY, FileName varchar(100)) 
        declare @saveDir varchar(250), @Cmd varchar(500)
        declare @Count int

    -- get the correct path for today's generated files in format \Year\Month\dd.mm.yyyy...     
        set @saveDir =@sUNCPath 
        + cast(YEAR(GETDATE()) as varchar(4)) 
        + '\'  + datename(month, GETDATE()) 
        + '\'+SUBSTRING(CONVERT(CHAR(20), GETDATE(), 101),4, 2) 
        + '.' + LEFT(CONVERT(CHAR(20), GETDATE(), 101), 2)
        + '.' + SUBSTRING(CONVERT(CHAR(20), GETDATE(), 101),7, 4)  

        -- using quoted identifier for the long string UNC path
        set @Cmd= 'dir "' + @saveDir + '" /b'

        insert into @files execute xp_cmdshell @cmd
        select @Count= COUNT(*) from @files     

        SET @countFiles=@Count

        RETURN @countFiles
        --print @countFiles
    END
 exec getDirFileCount @SaveDir, @letterCount OUTPUT
下面是我用来调用存储过程的代码:

declare @DaysOffset int=0, @I int =0

DECLARE @tmpLetterTbl TABLE (
    [docID] [int] IDENTITY(1,1) NOT NULL,
    [docRef] [varchar](50) NULL,
    [saveDir] [varchar](4000) NULL,
    [totalLettersExpected] [int] NULL,
    [actualLetters] [int] NULL,
    [EQRecordCount] [int] NULL
) 

insert @tmpLetterTbl SELECT distinct docRef, 
    saveDir=max(Save_Directory),
    COUNT(*) as 'Total Letters', null, null
  FROM [alpsMaster].[dbo].[uExtractMonitor]
  where YPTMPID<>0
  group by docRef
  order by 1,2

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

set @Date=rtrim(CONVERT( CHAR(12), getDate()-@DaysOffset, 106)) --'29 Oct 2013'
SET @RowCount = (SELECT COUNT(docID) FROM @tmpLetterTbl) 

WHILE (@I <= @RowCount)
    BEGIN

        DECLARE @docRef VARCHAR(10)
        DECLARE @saveDir VARCHAR(500)
        DECLARE @letterCount int

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

    update @tmpLetterTbl set actualLetters = 0 where docRef=@docRef         
    exec getDirFileCount @SaveDir, @letterCount 

    print cast(@letterCount as varchar(3)) + ' letters in directory: ' + @saveDir

    update @tmpLetterTbl set actualLetters = @letterCount where docID = @I              
    set @I=@I+1

    END
我希望表变量@tmpLetterTbl更新为stroed proc getDirFileCount返回的目录中的文件数

我没有收到任何错误,但是@letterCount没有被填充

请问我做错了什么

谢谢
Philip

您还必须在调用过程时用输出修饰参数:

create procedure getDirFileCount (
    @sUNCPath Varchar(500),
    @countFiles int OUTPUT
    )

AS
    BEGIN
        declare @files table (ID int IDENTITY, FileName varchar(100)) 
        declare @saveDir varchar(250), @Cmd varchar(500)
        declare @Count int

    -- get the correct path for today's generated files in format \Year\Month\dd.mm.yyyy...     
        set @saveDir =@sUNCPath 
        + cast(YEAR(GETDATE()) as varchar(4)) 
        + '\'  + datename(month, GETDATE()) 
        + '\'+SUBSTRING(CONVERT(CHAR(20), GETDATE(), 101),4, 2) 
        + '.' + LEFT(CONVERT(CHAR(20), GETDATE(), 101), 2)
        + '.' + SUBSTRING(CONVERT(CHAR(20), GETDATE(), 101),7, 4)  

        -- using quoted identifier for the long string UNC path
        set @Cmd= 'dir "' + @saveDir + '" /b'

        insert into @files execute xp_cmdshell @cmd
        select @Count= COUNT(*) from @files     

        SET @countFiles=@Count

        RETURN @countFiles
        --print @countFiles
    END
 exec getDirFileCount @SaveDir, @letterCount OUTPUT

还必须在对过程的调用中使用输出装饰参数:

create procedure getDirFileCount (
    @sUNCPath Varchar(500),
    @countFiles int OUTPUT
    )

AS
    BEGIN
        declare @files table (ID int IDENTITY, FileName varchar(100)) 
        declare @saveDir varchar(250), @Cmd varchar(500)
        declare @Count int

    -- get the correct path for today's generated files in format \Year\Month\dd.mm.yyyy...     
        set @saveDir =@sUNCPath 
        + cast(YEAR(GETDATE()) as varchar(4)) 
        + '\'  + datename(month, GETDATE()) 
        + '\'+SUBSTRING(CONVERT(CHAR(20), GETDATE(), 101),4, 2) 
        + '.' + LEFT(CONVERT(CHAR(20), GETDATE(), 101), 2)
        + '.' + SUBSTRING(CONVERT(CHAR(20), GETDATE(), 101),7, 4)  

        -- using quoted identifier for the long string UNC path
        set @Cmd= 'dir "' + @saveDir + '" /b'

        insert into @files execute xp_cmdshell @cmd
        select @Count= COUNT(*) from @files     

        SET @countFiles=@Count

        RETURN @countFiles
        --print @countFiles
    END
 exec getDirFileCount @SaveDir, @letterCount OUTPUT

看起来存储过程getDirFileCount中的变量@saveDir varchar250可能太小。您正在向其追加的字符串可能比varchar250长得多。存储过程getDirFileCount中的变量@saveDir varchar250可能太小。您正在向它附加一个比varchar250长得多的字符串。