[英]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.