Я получаю сообщение об ошибке: сообщение 137, уровень 15, состояние 2, строка 8 необходимо объявить скалярную переменную "@UtilityID" - PullRequest
0 голосов
/ 05 февраля 2020
IF EXISTS (SELECT * FROM SYSOBJECTS WHERE [Type] = 'P' AND [Name] = 'GetSiteSetupPagedList')
BEGIN
    DROP PROCEDURE [GetSiteSetupPagedList]
END
GO

CREATE PROCEDURE [GetSiteSetupPagedList]
    (@UtilityID VARCHAR(6),
     @ActiveOnly BIT = 1,
     --@UtilityID VARCHAR(6),
     -- Table Search Parameters
     @PageSize INT = 10,                                
     @RequestedPage INT = 0, -- 0-indexed           
     @SearchText VARCHAR(MAX) = '',                 
     @UseSelectedIDs BIT = 0,                       
     @SelectedIDs IntList READONLY ,
     @OrderBy VARCHAR(MAX) = NULL,
     @TotalPages INT OUT)
AS
BEGIN       
    SET @TotalPages = -1; -- -1 shall be interpreted as "use current value"

    IF @UseSelectedIDs = 1
    BEGIN
        SELECT
            [SiteID],
            [Site].[Name],
            [Site].[DefaultUtilityID],
            [Utility].[Name] AS 'DefaultUtilityName'

        FROM
            @SelectedIDs
            JOIN [Site] ON [Int] = [Site].[SiteID] AND [Site].AmendedTime IS NULL
            JOIN [Utility] ON [Utility].[UtilityID] = [Site].[DefaultUtilityID]  AND [Utility].AmendedTime IS NULL

        RETURN
    END

    DECLARE @SQL NVARCHAR(MAX),
            @From VARCHAR(MAX),
            @Where VARCHAR(MAX),
            @RowsToSkip INT,
            @TotalRecords INT


    -- Set the default order by
    IF ISNULL(@OrderBy, '') = ''
        SET @OrderBy = '[Site].[Name], [Site].[CreatedTime]'


    -- Calculate Rows to Skip for paging
    SET @RowsToSkip = @PageSize * @RequestedPage

    -- Create the WHERE clause
    SET @Where = '  WHERE [Site].AmendedTime IS NULL
                    AND  [Utility].AmendedTime IS NULL
    '

    -- Active filter
    IF @ActiveOnly = 1
    BEGIN
        SET @Where = @Where + ' AND [Site].[Active] = 1
                                AND [Utility].[UtilityID] = @UtilityID
        '
    END 


    -- Generic search filter
    IF LEN(@SearchText) > 0
    BEGIN
        SET @Where = @Where + ' AND 
            convert(varchar(10), [SiteID]) +
            [Site].[Name] +
            ISNULL([Site].[DefaultUtilityID], '''') +
            [Utility].[Name]
            LIKE ''%'' + @SearchText + ''%''        
            '
    END


    -- Create combined FROM/WHERE clause
    SET @From = ' FROM [Site]  
                JOIN [Utility] ON [Utility].[UtilityID] = [Site].[DefaultUtilityID]  
                '
    + @Where


    -- Calculate total pages if we're loading the first page and not grabbing specific IDs
    IF @RequestedPage = 0
    BEGIN
        SET @SQL = 'SELECT @TotalRecords = COUNT(*) ' + @From + ' '

        --print @SQL

        EXEC SP_EXECUTESQL @SQL, 
            N'@TotalRecords INT OUT, @SearchText VARCHAR(MAX)', 
            @TotalRecords = @TotalRecords OUT, @SearchText = @SearchText
        SET @TotalPages = CEILING(CONVERT(DEC(10,2), @TotalRecords) / CONVERT(DEC(10,2), @PageSize))
    END

    -- Final select
    SET @SQL = 'SELECT
            [SiteID],
            [Site].[Name],
            [Site].[DefaultUtilityID],
            [Utility].[Name] AS ''DefaultUtilityName''          
        ' + @From + '
            ORDER BY ' + @OrderBy + '
            OFFSET ' + CONVERT(VARCHAR, @RowsToSkip) + ' ROWS
            FETCH NEXT ' + CONVERT(VARCHAR, @PageSize) + ' ROWS ONLY 
        '
    --print @SQL

    EXEC SP_EXECUTESQL @SQL, 
        N'@SearchText VARCHAR(MAX)', 
        @SearchText = @SearchText
END   

1 Ответ

0 голосов
/ 06 февраля 2020

`

Когда я использовал:`

EXECUTE SP_EXECUTESQL @SQL, 
        N'@UtilityID varchar(6)',       -- this is an argument #1 with 1 parameter
        N'@SearchText VARCHAR(MAX)',    -- this is an argument #2 with 1 parameter
                                        -- that's why we get an error saying too 
                                        -- many arguments
        @UtilityID = @UtilityID,
        @SearchText = @SearchText

`
`
I get the message saying:

Msg 137, Level 15, State 2, Line 8
Must declare the scalar variable "@UtilityID".
Msg 8144, Level 16, State 2, Line 2
Procedure or function  has too many arguments specified.



It took me awhile to figure out but this is the correct syntax:
`
`
`
EXECUTE SP_EXECUTESQL @SQL, 
        N'@UtilityID varchar(6), 
          @SearchText VARCHAR(MAX)', 
`

          @UtilityID = @UtilityID, 
          @SearchText = @SearchText


`
...