簡體   English   中英

SQL 更新 - 變量

[英]SQL Update - variables

我一直遇到 SQL 問題,關於更新表(在任何地方都找不到答案)。

問題看起來像:

Update TABLE1
    SET @variable1 = @variable2
    WHERE SomeColumn = @variable3;

其中 variable1 和 variable3 是 varchar(50) 的類型,而 variable2 是 int 的類型。 我怎樣才能使這個工作? 我一直在嘗試使用 EXEC 或許多其他簡單的選項,但它們似乎對我不起作用。

在我在這里給出的代碼示例中,來自 variable2 的值被分配給 variable1 而不是名稱等於 variable1 的列,當我嘗試使用 Exec 時,它無法正確讀取 variable2(因為是 int 類型)。

您需要使用動態 SQL:

declare @sql nvarchar(max);

set @sql = '
Update TABLE1
    SET @variable1 = @variable2
    WHERE SomeColumn = @variable3';

set @sql = replace(@sql, '@variable1', @variable1);

exec sp_executesql @sql,
                   N'@variable2 int, @variable3 varchar(50)',
                   @variable2 = @variable2, @variable3 = @variable3;

注意:使用replace()是因為標識符(表名、列名、函數調用等)不能用參數表示。

DECLARE @variable1 varchar(50)
DECLARE @variable2 varchar(50)
DECLARE @variable3 varchar(50)
DECLARE @Sql varchar(max)

SET @variable1 = col1

Set @sql = 'Update TABLE1 SET' + @variable1 +' ='+ @variable2 +
    'WHERE SomeColumn = '+ @variable3

EXEC (@Sql)

如果需要動態設置@variable1

此查詢不會執行您認為的操作! 當您在參數@Variable1 中提供值“Doors”時,您會收到“Doors”錯誤。 @Variable1 必須是 TABLE1 中的有效列名。 SomeColumn 與它無關。

每當要在運行時決定模式元素(列名、表名)時,您都需要使用字符串方法動態構建 sql,正如其他答案所說。 我想說,這總是一個壞主意 永遠不必這樣做。 您的變量沒有有意義的名稱,這有點增加了混亂。 您可能已經這樣做了,因為在設計時,除了變量是可變的之外,您對變量一無所知。 這對我來說是一個明顯的跡象,表明您試圖用一個查詢做太多事情。 在您之后沒有人能夠維護此代碼。 你很可能會忘記你在寫它時到底想做什么。 (我仍然不清楚,如果你堅持下去,你能到達你想去的地方)。

IF OBJECT_ID('tempdb..#TAB') IS NOT NULL
BEGIN
    DROP TABLE #TAB
END

CREATE TABLE #TAB
(CH1 INT,CH2 INT,CH3 INT)

DECLARE @CH2 INT = NULL , @CH3 INT=NULL,@SPID INT=NULL,@SQL NVARCHAR(4000)='', @ParmDefinition NVARCHAR(50)= ''

SET @ParmDefinition='@SPID INT,@CH2 INT OUTPUT,@CH3 INT OUTPUT'

SET @SQL='UPDATE TOP(1) #TAB SET CH1=@SPID,@CH2= CH2,@CH3= CH3 WHERE CH1 IS NULL'

INSERT INTO #TAB
(CH2 ,CH3 )
SELECT 1,2 UNION ALL
SELECT 2,3 UNION ALL
SELECT 3,4

WHILE EXISTS(SELECT TOP 1 1 FROM #TAB WHERE CH1 IS NULL)
BEGIN
    EXECUTE sp_executesql @SQL, @ParmDefinition,@SPID =@@SPID,  @CH2=@CH2 OUTPUT,@CH3=@CH3 OUTPUT;  

    SELECT * FROM #TAB
    SELECT @CH2,@CH3

END

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM