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

SQL Server 2012在联接中使用声明的变量,sql,variables,join,sql-server-2012,declare,Sql,Variables,Join,Sql Server 2012,Declare,我是SQL Server的新手,希望这是有意义的:) 我试图声明要在内部联接中使用的变量 如果你看一看我的代码,你就会明白我在做什么,而不需要太多的细节。如果你需要更多信息,请告诉我。这种语法可能吗 编辑:请参阅下面的新尝试 --State - If suburb/postcode, could use postcode lookup Declare @Missing as nvarchar(255), @MissingUpdate as nvarchar(255), @MatchA

我是SQL Server的新手,希望这是有意义的:)

我试图声明要在内部联接中使用的变量

如果你看一看我的代码,你就会明白我在做什么,而不需要太多的细节。如果你需要更多信息,请告诉我。这种语法可能吗

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

    --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)
谢谢你的帮助,
Lucas

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

动态SQL查询的一个示例:

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

在没有动态SQL的情况下,不能将变量名用作列名

动态SQL查询的一个示例:

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

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

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

编辑:第二次尝试失败的原因可能是您正在将方括号中的名称传递给
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

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

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

编辑:第二次尝试失败的原因可能是您正在将方括号中的名称传递给
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

啊对。这是有道理的。我将尝试设置动态SQL。不过我可能很快就会回来。干杯啊对。这是有道理的。我将尝试设置动态SQL。不过我可能很快就会回来。干杯听起来不错。我要试一试。我们很快就会回来(希望不会)@Lucas:dynamicsql是一个字符串操作的问题,在像C#这样的客户端语言中,这通常更容易实现。祝你好运听起来不错。我要试一试。我们很快就会回来(希望不会)@Lucas:dynamicsql是一个字符串操作的问题,在像C#这样的客户端语言中,这通常更容易实现。祝你好运