2010-08-30 55 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

相關問題