我对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)
感谢您的帮助, 卢卡斯
答案 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)