Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 server 我得到一个错误,说Msg 137,级别15,状态2,第8行必须声明标量变量@实用ID“;_Sql Server_Stored Procedures - Fatal编程技术网

Sql server 我得到一个错误,说Msg 137,级别15,状态2,第8行必须声明标量变量@实用ID“;

Sql server 我得到一个错误,说Msg 137,级别15,状态2,第8行必须声明标量变量@实用ID“;,sql-server,stored-procedures,Sql Server,Stored Procedures,` 当我使用: ` 看第64行。动态sql字符串中包含@UtilityID。但您不会将该参数传递给动态sql。老实说,这东西看起来需要大修。到处都是动态sql,这表明设计有问题。我认为这里不需要任何动态sql。谢谢!我能修好那部分。我已经有一段时间没有这样做了,我可能需要做更多的阅读。现在,我得到的过程或函数必须指定许多参数。为什么要为此使用动态sql?这看起来只不过是一个带有几个where谓词的查询。 IF EXISTS (SELECT * FROM SYSOBJECTS WHERE [Typ

`

当我使用: `


看第64行。动态sql字符串中包含@UtilityID。但您不会将该参数传递给动态sql。老实说,这东西看起来需要大修。到处都是动态sql,这表明设计有问题。我认为这里不需要任何动态sql。谢谢!我能修好那部分。我已经有一段时间没有这样做了,我可能需要做更多的阅读。现在,我得到的过程或函数必须指定许多参数。为什么要为此使用动态sql?这看起来只不过是一个带有几个where谓词的查询。
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   
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


`