我一直遇到SQL问题,关于更新表格(无法在任何地方找到答案)。
问题如下:
Update TABLE1
SET @variable1 = @variable2
WHERE SomeColumn = @variable3;
其中variable1和variable3是varchar(50)的类型,而variable2是int的类型。我怎样才能使这个工作?我一直在尝试使用EXEC或许多其他简单的选项,但它们似乎不适合我。
在我给出的代码示例中,来自variable2的值被赋值给variable1而不是名称等于variable1的列,当我尝试使用Exec时,它无法读取变量2(因为int type)。
答案 0 :(得分:0)
您需要使用动态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()
是因为标识符(表名,列名,函数调用等)不能用参数表示。
答案 1 :(得分:0)
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
答案 2 :(得分:0)
此查询不符合您的想法!当您在参数@ Variable1中提供值“Doors”时,您将收到“Doors”错误。 @ Variable1必须是TABLE1中的有效列名。 SomeColumn与它无关。
每当要在运行时决定架构元素(列名,表名)时,你需要用字符串方法动态构造你的sql,正如其他答案所说。我想说,这总是一个坏主意。你从不必须这样做。你有点因为你的变量没有有意义的名字而增加了混乱。您可能已经这样做了,因为在设计时,除了变量之外,您对变量一无所知。这对我来说是一个明显的迹象,表明你试图用一个查询做太多。没有人能够维护这段代码。你可能会忘记写作时你试图做的事情。 (而且我仍然不清楚,如果你坚持下去,你可以到达你想去的地方)。
答案 3 :(得分:0)
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