Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.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_Stored Procedures_Sql Server 2008 R2 - Fatal编程技术网

Sql 存储过程的问题:";太多的争论”;

Sql 存储过程的问题:";太多的争论”;,sql,stored-procedures,sql-server-2008-r2,Sql,Stored Procedures,Sql Server 2008 R2,这似乎是一个相当普遍的问题,我不明白为什么会这样。我使用的软件应用程序无法直接访问源代码(我只能使用.NET Reflector查看一些源代码) 存储过程如下所示: ALTER PROCEDURE [dbo].[CS_GetMessages] ( @CustomerID C_ID, @Level C_Integer, @UsersTimeZoneOffset C_Integer ) AS BEGIN SET NOCOUNT ON SET TRANSACTION

这似乎是一个相当普遍的问题,我不明白为什么会这样。我使用的软件应用程序无法直接访问源代码(我只能使用.NET Reflector查看一些源代码)

存储过程如下所示:

ALTER PROCEDURE [dbo].[CS_GetMessages] (
    @CustomerID C_ID, @Level C_Integer, @UsersTimeZoneOffset C_Integer
    )
AS
BEGIN 
    SET NOCOUNT ON
    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

    DECLARE @Date Datetime
    SELECT @Date = CONVERT(nvarchar(10), getutcdate(), 101)

    SELECT
        [MessageID]

    FROM
        [dbo].[Messages]
    WHERE
        ([CustomerID] = @CustomerID OR [CustomerID] IS NULL) 
        AND Enabled = 1
        AND Deleted = 0
        AND (EffectiveDate IS NULL OR @Date >= CONVERT(nvarchar(10), DATEADD(minute, @UsersTimeZoneOffset, EffectiveDate), 101))
        AND (ExpiryDate IS NULL OR @Date < CONVERT(nvarchar(10),  DATEADD(minute, @UsersTimeZoneOffset, ExpiryDate), 101))
        AND Publish = 1
        AND Level = ISNULL(@Level, Level)
    ORDER BY MaintenanceDate DESC

END
但是,它抛出了一个错误:

Error: 8144, Severity: 16, State: 2 Procedure or function CS_GetMessages has too many arguments specified.
但是,如果手动运行该过程,它将正确返回一个值。我使用了以下测试代码:

DECLARE @return_value int

EXEC    @return_value = [dbo].[CS_GetMessages]
        @CustomerID = 'CT000001',
        @Level = NULL,
        @UsersTimeZoneOffset = 0

SELECT  'Return Value' = @return_value

GO
请注意,由于数据库为空(空表),因此没有数据,因此它会适当地返回0。你知道会发生什么吗

更新:执行数据库调用的源代码:

 private SystemMessageManager LoadSystemMessages()
        {
            int paramValue = Conversions.ToInteger(Utility.DataFromSession("UsersTimezoneOffset", string.Empty));
            SystemMessageManager messageManager = new SystemMessageManager();
            CriteriaCollection loadCriteria = new CriteriaCollection();
            CriteriaCollection criterias2 = loadCriteria;
            criterias2.Add("CustomerID", DbType.String, Utility.GetCurrentCustomer().CustomerID, ParameterDirection.Input, "");
            criterias2.Add("Level", DbType.Int32, null, ParameterDirection.Input, "");
            criterias2.Add("UsersTimezoneOffset", DbType.Int32, paramValue, ParameterDirection.Input, "");
            criterias2 = null;
            messageManager.Load(loadCriteria);
            this.CheckForDeactivation(messageManager);
            return messageManager;
        }

ALTER PROCEDURE[dbo].[CS_GetMessages]( @CustomerID C_ID、@Level C_Integer、@UsersTimeZoneOffset C_Integer )

将代码更改为

ALTER PROCEDURE [dbo].[CS_GetMessages] (
    @CustomerID BigInt, @Level Integer=NULL, @UsersTimeZoneOffset Integer
    )
默认情况下,整数为0,不为空。因此,您需要专门将其设置为null

exec CS_GetMessages @CustomerID=1,@Level=NULL,@UsersTimezoneOffset=0

是否在代码中指定了更多参数?@Szymon否,代码显示了适当数量的参数(3)。是否可能有两个名称相同但所有者不同的对象?因为在您的工作示例中,您有
[dbo].[CS_GetMessages]
,并且在您的代码中,您得到的错误是刚刚出现的
CS_GetMessages
,那么,如果您指定所有者呢?另外,扩展@JorgeCampos注释,检查探查器跟踪,确保它在执行时实际位于正确的数据库中。@NathanC不仅检查数据库,而且检查对象的架构。你能试试exec dbo.CS_GetMessages@CustomerID=N'CT000001',@Level=NULL,@UsersTimezoneOffset=0看看会发生什么吗?在我的工厂里,开发人员经常犯这样的错误:我们有一个对象的模式,他们有他们的用户,因此,如果他们创建一个没有模式名称的对象,应用程序将无法工作,因为这个对象是为开发人员的用户创建的。
exec CS_GetMessages @CustomerID=1,@Level=NULL,@UsersTimezoneOffset=0