当我从SQL Server Management Studio执行存储过程时,我有一个正常工作的存储过程。不幸的是,它在生产服务器上的行为方式不同。在insert语句中,它只插入一些值,其余值为NULL。 NULL值来自用户定义的标量函数调用(从Management Studio执行时也可正常工作)。有没有人碰到类似的东西?我当时认为这可能是权限问题,但我通过Management Studio使用生产连接凭据连接到数据库,并看到了相同的行为。我是一名C#开发人员,通常与ORM合作,所以我绝对不是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连接到dev数据库,我直接连接到生产数据库)。当我从Management Studio执行存储过程时,它是完美的。当表上的触发器调用sproc时,GetPropertyValue函数失败。
答案 0 :(得分:1)
虽然在没有表结构,sprocs和函数的情况下无法看到发生了什么,但我的想法是比较PROD和DEV中的表结构,默认值,标识列等。
答案 1 :(得分:1)
在其上获取SQL事件探查器,然后复制&粘贴&执行查询分析器中的语句。
您的作品可能会产生微妙的不同代码,或者正在注入不同于您期望的参数值,这将完全 正在发生的事情。
答案 2 :(得分:0)
这对我说在您的应用程序代码中有些有趣。我会检查你的C#逻辑并确保你在命令对象上使用正确的函数调用。发布您的代码可能会有所帮助。
答案 3 :(得分:0)
正如日产范所说,你没有提供足够的信息。也就是说,一种可能性是你在SQL Server 2000上遇到an old bug。但是,如果您想要一个有用的答案,请提出一个有用的问题。