2017-01-04 83 views
0

我一直坚持与SQL的问题,关于更新表(无法找到答案任何地方)。SQL更新 - 变量

问题看起来像:

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

当变量1和variable3为varchar(50)的类型,变量2为int的类型。我怎样才能使这个工作?我一直在尝试使用EXEC或许多其他简单的选项,但它们似乎不适合我。

在这里给出的代码示例中,variable2的值被赋值给变量1,而不是名称等于变量1的列,当我尝试使用Exec时,它无法读取变量2(因为int类型)正常。

+0

该查询没有意义。它在做什么? –

+0

我应该编写一个程序,使表看起来不同(与我将使用PIVOT,但我不能使用该操作相同),这就是为什么最后我需要更新3个变量表。在这篇文章下的答案正在......但在我的程序中似乎还有另一个问题......“消息207,等级16,状态1,行85 列名'Doors'无效。”不知道为什么SQL,而不是将它看作行的值,在名为SomeColumn的列中,它正在寻找名称为“Doors”的列... Ps.I SomeColumn列下有一个记录门:/ – SigKillMe

回答

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) 

如果需要动态设置@变量1

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()被使用,因为标识符(表名,列名,函数调用等)不能被参数来表示。

0

此查询不去做你认为它!当您在参数@ Variable1中提供值“Doors”时,您会看到“门”错误。 @ Variable1必须是TABLE1中的有效列名称。 SomeColumn与它无关。

无论何时在运行时决定模式元素(列名,表名),您需要使用字符串方法动态构建您的sql,如其他答案所述。我想说,这是总是一个坏主意。你从来没有必须这样做。你不应该为变量添加有意义的名称,这会增加混淆。你可能这样做是因为在设计时,除了变量之外,你不知道变量的任何内容。这对我来说是一个明确的信号,表明你试图用一个查询做太多。没有人会在你能够维护这些代码之后出现。你可能会忘记当你写它时你想要做什么。 (如果你坚持下去的话,我仍然不清楚你可以到哪里去。

+0

那么这个命名模式只是针对堆栈的溢出问题做出的。在我真正的问题中,我有一些常用的colums名称,我只是不想用这种不同的语言来表达一些奇怪的单词,因为它应该是简单易懂的例子; d 顺便说一句,找到了我的问题的答案。每次我把变量,我不得不像EXEC这样的东西:“...'''+ @ variable +'''...”,它为我工作;) 感谢您的帮助和时间 – SigKillMe