1

別の SQL ストアド プロシージャを呼び出す SQL ストアド プロシージャがあります。SQLサーバーで実行すると正常に動作します。しかし、クラスの関数から呼び出すと、サブプロシージャによって返された DataTable が返されます。メイン プロシージャによって返されたデータを返したい。

私の主な手順:

ALTER PROCEDURE [dbo].[StoredProcedure2]

@QuaterList varchar(50) = NULL
AS
BEGIN
    DECLARE @sql nvarchar(4000)

    SELECT @sql='SELECT Id, Suggester, Requester, Date_Created from CRM.dbo.CRM_Doctor_Request WHERE 1=1 '
    If (@QuaterList) IS NOT NULL
    BEGIN
        DECLARE @MonthsList varchar(1000)
        EXEC dbo.SPGetMonthsListforMultipleQuaters  @QuaterList, @MonthsList OUTPUT
        SELECT @MonthsList
        SELECT @sql=@sql + ' AND MONTH(Date_Created) in ('
        + SUBSTRING(@MonthsList, 1, LEN(@MonthsList)-1) +')'
    END


    EXEC sp_executesql @sql, N' @QuaterList varchar(50) ', 
                    @QuaterList
END

サブプロシージャSPGetMonthsListforMultipleQuaters:

ALTER PROCEDURE dbo.SPGetMonthsListforMultipleQuaters
    @InputList varchar(10),
    @MonthsList varchar(1000) OUTPUT
AS
BEGIN
    SELECT @MonthsList= ''
    /* Create temp table */
    CREATE TABLE #TempListTable
    (
        TableField int
    )
    /* add data into temp table */
    DECLARE @TableField varchar(10), @Pos int

    SET @InputList = LTRIM(RTRIM(@InputList))+ ','
    SET @Pos = CHARINDEX(',', @InputList, 1)

    IF REPLACE(@InputList, ',', '') <> ''
    BEGIN
        WHILE @Pos > 0
        BEGIN
            SET @TableField = LTRIM(RTRIM(LEFT(@InputList, @Pos - 1)))
            IF @TableField <> ''
            BEGIN
                INSERT INTO #TempListTable (TableField) VALUES (CAST(@TableField AS int)) --Use Appropriate conversion
            END
            SET @InputList = RIGHT(@InputList, LEN(@InputList) - @Pos)
            SET @Pos = CHARINDEX(',', @InputList, 1)
        END
    END 
    /* fetch data from temptable using cursor */
    DECLARE @ArrayItem nvarchar(100)
    DECLARE @Array_Cursor CURSOR

    SET @Array_Cursor = CURSOR FAST_FORWARD FOR select TableField 
    from #TempListTable

    OPEN @Array_Cursor
    FETCH NEXT FROM @Array_Cursor  INTO @ArrayItem

    WHILE @@FETCH_STATUS = 0  
    BEGIN
        /* creating list of months */

        IF (@ArrayItem = 1)
            SELECT @MonthsList=@MonthsList + '4,5,6,'
        IF (@ArrayItem = 2)
            SELECT @MonthsList=@MonthsList + '7,8,9,'
        IF (@ArrayItem = 3)
            SELECT @MonthsList=@MonthsList + '10,11,12,'
        IF (@ArrayItem = 4)
            SELECT @MonthsList=@MonthsList + '1,2,3,'

        FETCH NEXT FROM @Array_Cursor INTO @ArrayItem
    END
    /*print @MonthsList*/

    Close  @Array_Cursor
    deallocate  @Array_Cursor
END
4

1 に答える 1

1

Problem solved. It was because I wrote SELECT @MonthsList so it was returning that too which is not required, and was also creating problems. So I removed it and problem solved.

New Procedure code is :

ALTER PROCEDURE [dbo].[StoredProcedure2]

@QuaterList varchar(50) = NULL
AS
BEGIN
    DECLARE @sql nvarchar(4000)

    SELECT @sql='SELECT Id, Suggester, Requester, Date_Created from CRM.dbo.CRM_Doctor_Request WHERE 1=1 '
    If (@QuaterList) IS NOT NULL
    BEGIN
        DECLARE @MonthsList varchar(1000)
        EXEC dbo.SPGetMonthsListforMultipleQuaters  @QuaterList, @MonthsList OUTPUT

        SELECT @sql=@sql + ' AND MONTH(Date_Created) in ('
        + SUBSTRING(@MonthsList, 1, LEN(@MonthsList)-1) +')'
    END


    EXEC sp_executesql @sql, N' @QuaterList varchar(50) ', 
                    @QuaterList
END
于 2013-02-27T07:11:31.123 に答える