而不必逗号分隔列表的我会创建一个单独的参数为每个列并使其默认值设置为NULL,并在代码更新什么,如果它的空或插入0。事情是这样的....
CREATE PROCEDURE usp_UserPermissions
@UserID INT
,@Update INT = NULL --<-- Make default values NULL
,@Delete INT = NULL
,@Read INT = NULL
,@Write INT = NULL
,@Access INT = NULL
AS
BEGIN
SET NOCOUNT ON;
Declare @t TABLE (UserID INT, [Update] INT,[Read] INT
,[Write] INT,[Delete] INT,[Access] INT)
INSERT INTO @t (Userid, [Update],[Read],[Write],[Delete],[Access])
VALUES (@UserID , @Update , @Read, @Write , @Delete, @Access)
IF EXISTS (SELECT 1 FROM UserPermission WHERE UserID = @UserID)
BEGIN
UPDATE up -- Only update if a value was provided else update to itself
SET up.[Read] = ISNULL(t.[Read] , up.[Read])
,up.[Write] = ISNULL(t.[Write] , up.[Write])
,up.[Update] = ISNULL(t.[Update] , up.[Update])
,up.[Delete] = ISNULL(t.[Delete] , up.[Delete])
,up.[Access] = ISNULL(t.[Access] , up.[Access])
FROM UserPermission up
INNER JOIN @t t ON up.UserID = t.UserID
END
ELSE
BEGIN
-- if already no row exists for that User add a row
-- If no value was passed for a column add 0 as default
INSERT INTO UserPermission (Userid, [Update],[Read],[Write],[Delete],[Access])
SELECT Userid
, ISNULL([Update], 0)
, ISNULL([Read], 0)
, ISNULL([Write], 0)
, ISNULL([Delete], 0)
, ISNULL([Access], 0)
FROM @t
END
END
显示您的代码。 – Han
样本数据和预期结果将会更有帮助。另外添加你到目前为止尝试的查询 –
可能想要使用像'MERGE' – scsimon