2010-08-30 30 views
0

我有一个存储过程,当我从SQL Server Management Studio执行存储过程时能够正常工作。不幸的是,它在生产服务器上的表现并不一样。在插入语句中,它只插入一些值,其余为NULL。 NULL值来自用户定义的标量函数调用(从Management Studio执行时也可以正常工作)。有没有人遇到类似的事情?我认为这可能是一个权限问题,但我通过Management Studio使用生产连接证书连接到数据库,并看到相同的行为。我是一个通常与ORM一起工作的C#开发人员,所以我绝对不是SQL专家。在此先感谢,伙计们。存储过程从管理工作室正确执行,但没有在生产

下面是代码:

BEGIN 
    DECLARE @UserExists int 
    SET @UserExists = 0 
    SELECT @UserExists = COUNT(*) FROM UserPass WHERE UserId = @UserID AND PortalID = @PORTALID 


    --If the Action is add and a User Exists change the Action to EDT (Update) 
    IF @Action = 'ADD' AND @UserExists > 0 
    SET @Action = 'EDT' 

    --Get All Of the Properties for this User 
    DECLARE @EMAIL nvarchar(255) 
    DECLARE @FIRSTNAME nvarchar(50) 
    DECLARE @LASTNAME nvarchar(50) 
    DECLARE @GENDER char(1) 
    DECLARE @BIRTHDATE smalldatetime 
    DECLARE @ADDRESS nvarchar(50) 
    DECLARE @CITY nvarchar(50) 
    DECLARE @STATE nchar(2) 
    DECLARE @COUNTRY nvarchar(50) 
    DECLARE @POSTALCODE nvarchar(10) 
    DECLARE @TELEPHONE nvarchar(20) 
    DECLARE @CELL nvarchar(20) 
    DECLARE @EMAILPERMISSION bit 
    DECLARE @TEXTPERMISSION bit 
    DECLARE @UPDATEDIRECTION nvarchar(3) 

    BEGIN TRY 
     SELECT @BIRTHDATE = CAST(dbo.GetPropertyValue(@PORTALID,@USERID,'Birthdate') AS SmallDatetime) 

    END TRY 
    BEGIN CATCH 
     SELECT @BIRTHDATE = NULL 
    END CATCH 

    SELECT @EMAIL = Email, 
     @FIRSTNAME = dbo.Proper(Firstname), 
     @LASTNAME = dbo.Proper(Lastname), 
     @GENDER = dbo.GetPropertyValue(@PORTALID,@USERID,'Gender'), 
     @ADDRESS = dbo.GetPropertyValue(@PORTALID,@USERID,'Street'), 
     @CITY = dbo.Proper(dbo.GetPropertyValue(@PORTALID,@USERID,'City')), 
     @STATE = Upper(dbo.GetState(dbo.GetPropertyValue(@PORTALID,@USERID,'Region'))), 
     @COUNTRY = dbo.GetPropertyValue(@PORTALID,@USERID,'Country'), 
     @POSTALCODE = dbo.GetPropertyValue(@PORTALID,@USERID,'Postalcode'), 
     @TELEPHONE = dbo.STRFILTER(dbo.GetPropertyValue(@PORTALID,@USERID,'Telephone'),'0,1,2,3,4,5,6,7,8,9'), 
     @CELL = dbo.STRFILTER(dbo.GetPropertyValue(@PORTALID,@USERID,'Cell'),'0,1,2,3,4,5,6,7,8,9'), 
     @EMAILPERMISSION = dbo.GetPropertyValue(@PORTALID,@USERID,'eNewsLetter'), 
     @TEXTPERMISSION = dbo.GetPropertyValue(@PORTALID,@USERID,'TextPermission') 
    FROM Users 
    WHERE UserId = @USERID 


     -- Insert new user 
     IF @Action = 'ADD' 
      BEGIN 

       INSERT INTO UserPass 
        (UserID, Portalid, CreatedDate, Username, UserPass.Password, email, firstname, lastname, gender, birthdate, UserPass.address, city, UserPass.state, country, postalcode, telephone, cell, emailpermission, textpermission, UpdateDirection) 
       VALUES 
        (@UserID, @PORTALID, @CREATEDDATE, @Username, @Password, @EMAIL, @FIRSTNAME, @LASTNAME,@GENDER, @BIRTHDATE, @ADDRESS, @CITY, @STATE, @COUNTRY, @POSTALCODE, @TELEPHONE, @CELL, @EMAILPERMISSION, @TEXTPERMISSION, 'OUT') 

    END 

@PORTALID和@USERID被传递给存储过程作为参数,这些值是在所述插入件实际上节省。未更新的列是为该值调用GetPropertyValue函数的列。这只在一个数据库服务器上(我没有通过Management Studio连接到开发数据库,​​我直接连接到生产数据库)。当我从Management Studio执行存储过程时,它是完美的。当表上的触发器调用存储过程时,GetPropertyValue函数失败。

+2

如果有权限错误,你会知道的。我的猜测是这些函数是建立在支持不存在的子引用上的 - 这就是为什么你会因为它们而得到NULL的原因......你需要发布存储过程代码,并且至少有一个函数使用... – 2010-08-30 22:18:54

回答

1

获取SQL事件探查器,然后复制&粘贴&执行查询分析器中的语句。

您的产品很可能产生了细微差别的代码,或者注入了不同于您所期望的参数值,并且这会捕获恰好为发生了什么情况。

+0

Profiler是否跟踪触发器的存储过程调用?我试过运行Profiler,但它似乎并没有捕获我需要查看的sproc或函数调用。他们实际上正在执行。 – user211570 2010-08-31 15:41:42

+0

我相信它不会默认,但可以做。 Offhand不记得如何,这个东西不是最方便用户的。 – annakata 2010-08-31 16:04:02

+0

我已经弄清了这部分。当您开始新的跟踪时,在事件选择选项卡中,选中“显示所有事件”,然后在存储过程下,选中SP:StmtCompleted和SP:StmtStarting。感谢您的帮助annakata。我正在追踪存储过程和函数,但仍在研究如何判断传递的值。 – user211570 2010-08-31 16:08:18

0

对我说,你的应用程序代码中有些东西很有趣。我会检查你的C#逻辑并确保你在命令对象上使用了正确的函数调用。它可能有助于发布您的代码。

+0

没有应用程序代码。只需触发器,存储过程和用户​​定义的函数。 – user211570 2010-08-31 14:54:46

+0

那么什么是执行生产中的sproc呢? – annakata 2010-08-31 14:57:20

+0

桌上的触发器。 – user211570 2010-08-31 15:04:58

1

虽然没有表结构,sprocs和函数是不可能的,但我的想法是比较PROD和DEV中的表结构,默认值,标识列等。

+0

只有一个数据库。 – user211570 2010-08-31 14:53:47

+0

您可能面临的另一个问题是默认值处理方式不同。你可能在SQL Server中有一个可为空的列,默认为0,但是对于.NET,你必须将它设置为0才能使用该默认值,否则它将为NULL。 – 2010-08-31 21:25:34

+0

没有涉及.NET。 – user211570 2010-09-01 13:26:23

0

正如日产范说的,你没有提供足够的信息。也就是说,有一种可能性是您正在使用SQL Server 2000并遇到an old bug。如果你想要一个有用的答案,但是,问一个有用的问题。

+0

使用SQL Server 2005.我并不真正期待一个有用的答案,只是检查是否有什么明显的我缺少,因为我已经不在我的这个元素。 – user211570 2010-08-31 14:55:40

相关问题