2013-12-17 47 views
1

我爲2或3或4或'n'個用戶名傳遞一個密碼值。動態更新SQL中的列值

如何將user_id動態地傳遞給更新查詢?

update user_table 
set column_password = 'password value' 
where user_id in () 
+0

這是存儲過程還是其他? – Joe

+0

它在存儲過程中 – goofyui

+0

這個值是如何在參數中傳入存儲過程的?什麼是@param的示例值? – Joe

回答

2

首先使用此代碼創建函數:

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE FUNCTION [dbo].[SplitIDs] 
(
    @List varchar(5000) 
) 
RETURNS 
@ParsedList table 
(
    ID int 
) 
AS 
BEGIN 
    DECLARE @ID varchar(10), @Pos int 

    SET @List = LTRIM(RTRIM(@List))+ ',' 
    SET @Pos = CHARINDEX(',', @List, 1) 

    IF REPLACE(@List, ',', '') <> '' 
    BEGIN 
     WHILE @Pos > 0 
     BEGIN 
      SET @ID = LTRIM(RTRIM(LEFT(@List, @Pos - 1))) 
      IF @ID <> '' 
      BEGIN 
       INSERT INTO @ParsedList (ID) 
       VALUES (CAST(@ID AS int)) --Use Appropriate conversion 
      END 
      SET @List = RIGHT(@List, LEN(@List) - @Pos) 
      SET @Pos = CHARINDEX(',', @List, 1) 

     END 
    END 
    RETURN 
END 

GO 

然後在存儲過程declate @UserIDs varchar(max)。你將傳遞逗號分隔的ID列表到這個參數中。

然後在你的存儲過程,你可以有:

update U 
set U.column_password = 'password value' 
FROM dbo.SplitIDs(@UserIDs) I 
INNER JOIN user_table U ON I.ID=U.user_id 
+0

謝謝。我對這個函數的理解是,輸入參數@List只接受逗號分隔值。 – goofyui

+1

是的,就像我在回答中所說的:「你會將逗號分隔的ID列表傳遞給這個參數。」您提到user_id的子查詢中的 – Dimitri

0

只是一個想法。如果這已經存在於存儲過程中,那麼很可能您已經通過select語句獲得了user_id。我會做這樣的事情。

update user_table 
set column_password = 'password value' 
where user_id in (select user_id from table 
where criteria = '') 
+0

。在我的場景中,user_id是動態傳遞的。 user_id的號碼將會改變 – goofyui

+0

您好,我們將根據子查詢的結果處理任何數量的user_id,無論這個數字是100萬還是任何數字。我相信從我上面看到你的評論,儘管你可能正在尋找別的東西。 –

1

創建一個函數

CREATE FUNCTION [dbo].[FnSplit] 
(
@List nvarchar(2000), 
@SplitOn nvarchar(5) 
) 
RETURNS @RtnValue table (Id int identity(1,1), Value nvarchar(100)) 
AS 
BEGIN 

While(Charindex(@SplitOn,@List)>0) 

    Begin 


     Insert Into @RtnValue (value) 

     Select Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1))) 

     Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List)) 

    End 


Insert Into @RtnValue (Value) 

Select Value = ltrim(rtrim(@List)) 

Return 

END 

存儲過程

CREATE Procedure usp_Multipleparameter (@Users VARCHAR(1000)= NULL) 
AS 
BEGIN 

     update user_table 
     set column_password = 'password value' 
     where user_id collate database_default IN (SELECT Value FROM dbo.FnSplit(@Users,',')) 

END 
GO 

調用存儲過程

EXEC usp_Multipleparameter 'User1,User2' 
+0

謝謝@MuhammedAli – goofyui

+0

Tesco表示「Every Little Helps」大聲笑:) –