SQL Update - 变量

时间:2017-01-04 19:39:05

标签: sql sql-server variables sql-update

我一直遇到SQL问题,关于更新表格(无法在任何地方找到答案)。

问题如下:

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

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

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

4 个答案:

答案 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