[英]SQL dynamic columns and Update multiple columns
我有一個表UserPermission
,它有許多TINYINT
類型的列。 例如,讀,寫,更新,刪除,訪問等
我在存儲過程中得到三個參數: @UserId, @ColNames, @ColValues
其中@ColNames
和@ColValues
是逗號分隔值。
如何使用傳遞的列名和相應的值插入或更新表行(如果已存在)。
我試着寫它運行的罰款動態查詢INSERT
,但我無法寫UPDATE
每列,並將其值動態查詢是串連。
任何回應將不勝感激
提前致謝。
這是一種有點骯臟的方式來做你需要的。 但是,如果您創建以下存儲過程:
CREATE FUNCTION [dbo].[stringSplit]
(
@String NVARCHAR(4000),
@Delimiter NCHAR(1)
)
RETURNS TABLE
AS
RETURN
(
WITH Split(stpos,endpos)
AS(
SELECT 0 AS stpos, CHARINDEX(@Delimiter,@String) AS endpos
UNION ALL
SELECT endpos+1, CHARINDEX(@Delimiter,@String,endpos+1)
FROM Split
WHERE endpos > 0
)
SELECT 'Id' = ROW_NUMBER() OVER (ORDER BY (SELECT 1)),
'Data' = SUBSTRING(@String,stpos,COALESCE(NULLIF(endpos,0),LEN(@String)+1)-stpos)
FROM Split
)
然后,您可以使用該過程將數據連接在一起:
DECLARE @TotalCols INT
DECLARE @TotalVals INT
SET @TotalCols = (
SELECT COUNT(ID) AS Total
FROM dbo.stringSplit('department, teamlead', ',')
);
SET @TotalVals = (
SELECT COUNT(ID) AS Total
FROM dbo.stringSplit('IT, Bob', ',')
);
IF @TotalCols = @TotalVals
BEGIN
IF OBJECT_ID('tempdb..#temptable') IS NOT NULL
DROP TABLE #temptable
CREATE TABLE #temptable (
ColName VARCHAR(MAX) NULL
,ColValue VARCHAR(MAX) NULL
)
INSERT INTO #temptable
SELECT a.DATA
,b.DATA
FROM dbo.stringSplit('department, teamlead', ',') AS a
INNER JOIN dbo.stringSplit('IT, Bob', ',') AS b ON a.Id = b.Id
SELECT *
FROM #temptable;
END
它不是很有效,但會帶給你理想的效果。
然后,您可以根據需要使用臨時表進行更新,插入和刪除。
我沒有逗號分隔列表,而是為每個列創建一個單獨的參數,並將其默認值設置為NULL,如果為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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.