SQL Server 2012在连接中使用声明的变量

时间:2013-12-03 03:08:17

标签: sql variables join sql-server-2012 declare

我对SQL Server很陌生,所以希望这是有道理的:)

我正在尝试声明要在INNER JOIN中使用的变量。

如果你看一下我的代码,你会看到我正在尝试做的事情,而不需要深入细节。如果您需要更多信息,请告诉我。这种语法可能吗?

编辑:请参阅下面的新尝试

    --State - If suburb/postcode, could use postcode lookup
Declare @Missing as nvarchar(255),
 @MissingUpdate as nvarchar(255),
 @MatchA as nvarchar(255),
 @MatchB as nvarchar(255),
 @Reason as nvarchar(255);

Set @Missing = '[StateEXPORT]'; -- field to update
Set @MissingUpdate = '[State]'; -- field in postcode lookup to pull in
Set @MatchA = '[PostcodeEXPORT]'; -- field in master field to match with
Set @MatchB = '[Pcode]'; -- field in postcode lookup to match with
Set @Reason = 'Contactable - Needs verificiation - @MissingUpdate taken from Lookup'; -- reason here

update [BT].[dbo].[test]
set @Missing = b.@MissingUpdate,    
    FinalPot =  @Reason
FROM [BT].[dbo].[test] a
INNER JOIN [BT].[dbo].[Postcode Lookup] b
ON a.@MatchA = b.@MatchB
where (@Missing is null or @Missing = '0') and [AddressSource] != ('Uncontactable')
GO

编辑:第二次尝试:

set @sql = 'update [BT].[dbo].[test] set ' + quotename(@Missing) + '= b.' +     quotename(@MissingUpdate) + ', FinalPot = ' + @Reason + 'FROM [BT].[dbo].[test] a INNER JOIN [BT].[dbo].[Postcode Lookup] b ON a.' + quotename(@MatchA) + ' = b.' + quotename(@MatchB) + 'where (' + quotename(@Missing) + 'is null or' + quotename(@Missing) + ' = 0 and [AddressSource] != "(Uncontactable)"'

exec (@sql)

感谢您的帮助, 卢卡斯

2 个答案:

答案 0 :(得分:1)

不,这种语法是不可能的,至少不是直接的:你需要指定列名,而不是具有名称的字符串变量。

如果您希望动态决定列的名称,可以创建一个表示您希望执行的语句的SQL字符串,并将该字符串传递给EXECUTE command。但是,您必须格外小心,不要将任何用户输入的数据放入生成的SQL字符串中,以避免SQL injection attacks

编辑:您的第二次尝试可能失败的原因是您将方括号中的名称传递给quotename。您应该从变量声明中删除括号,如下所示:

Set @Missing = 'StateEXPORT'; -- field to update
Set @MissingUpdate = 'State'; -- field in postcode lookup to pull in
Set @MatchA = 'PostcodeEXPORT'; -- field in master field to match with
Set @MatchB = 'Pcode'; -- field in postcode lookup to match with

答案 1 :(得分:0)

如果没有动态SQL,则不能将变量名称用作列名。

动态SQL查询的示例:

declare @ColumnName varchar(100) = 'col1'
declare @sql varchar(max)
set @sql = 'select ' + quotename(@ColumnName) + ' from dbo.YourTable'
exec (@sql)