Sql 存储过程的问题:";太多的争论”;
这似乎是一个相当普遍的问题,我不明白为什么会这样。我使用的软件应用程序无法直接访问源代码(我只能使用.NET Reflector查看一些源代码) 存储过程如下所示: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
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