SQL引用带有变量的外键
我必须检查循环中的几个外键,并且需要用变量(例如@fk_field)替换外键字段的名称 我的查询如下所示:SQL引用带有变量的外键,sql,sql-server,variables,Sql,Sql Server,Variables,我必须检查循环中的几个外键,并且需要用变量(例如@fk_field)替换外键字段的名称 我的查询如下所示: SELECT ad.id , ad.@fk_field , a1.@jnktn_field FROM @tblname tbl LEFT JOIN @jnktn_tbl jnktn ON tbl.@fk_field=jnktn.@jnktn_field WHERE ad.FK1 <> isnull(a1
SELECT
ad.id
, ad.@fk_field
, a1.@jnktn_field
FROM @tblname tbl LEFT JOIN @jnktn_tbl jnktn ON tbl.@fk_field=jnktn.@jnktn_field
WHERE ad.FK1 <> isnull(a1.ID,0)
选择
广告id
,ad.@fk_字段
,a1.@jnktn_字段
从@tblname tbl LEFT加入@jnktn\u tbl jnktn ON tbl@fk\u field=jnktn@jnktn\u field
其中ad.FK1为空(a1.ID,0)
显然,不可能像我那样在点之后直接使用变量,但我需要这样做来引用正确的表。那么,如何使用变量来插入在SQL查询之前设置的字段名呢?这取决于您使用该查询的位置和方式 SQLCMD变量
:setvar FKFIELD field_name
SELECT
ad.id
, ad.@fk_field
, a1.@jnktn_field
FROM @tblname tbl LEFT JOIN @jnktn_tbl jnktn ON tbl.$(FKFIELD)=jnktn.field
WHERE ad.FK1 <> isnull(a1.ID,0)
SELECT
ad.id
, ad.field
, a1.field
FROM @tblname tbl
LEFT JOIN @jnktn_tbl jnktn ON tbl.Field1=jnktn.field and @fk_field = 'fieldName1'
LEFT JOIN @jnktn_tbl jnktn ON tbl.Field2=jnktn.field and @fk_field = 'fieldName2'
LEFT JOIN @jnktn_tbl jnktn ON tbl.Field3=jnktn.field and @fk_field = 'fieldName3'
WHERE ad.FK1 <> isnull(a1.ID,0)
:setvar FKFIELD\u名称
选择
广告id
,ad.@fk_字段
,a1.@jnktn_字段
从@tblname tbl LEFT加入@jnktn_tbl jnktn ON tbl.$(FKFIELD)=jnktn.field
其中ad.FK1为空(a1.ID,0)
执行语句
EXEC('SELECT
ad.id
, ad.@fk_field
, a1.@jnktn_field
FROM @tblname tbl LEFT JOIN @jnktn_tbl jnktn ON tbl.' + @fk_field +'=jnktn.field
WHERE ad.FK1 <> isnull(a1.ID,0)')
EXEC('选择
广告id
,ad.@fk_字段
,a1.@jnktn_字段
从@tblname tbl LEFT加入@jnktn\u tbl jnktn在tbl上。'+@fk_field+'=jnktn.field
其中ad.FK1为空(a1.ID,0'))
多个连接子句
:setvar FKFIELD field_name
SELECT
ad.id
, ad.@fk_field
, a1.@jnktn_field
FROM @tblname tbl LEFT JOIN @jnktn_tbl jnktn ON tbl.$(FKFIELD)=jnktn.field
WHERE ad.FK1 <> isnull(a1.ID,0)
SELECT
ad.id
, ad.field
, a1.field
FROM @tblname tbl
LEFT JOIN @jnktn_tbl jnktn ON tbl.Field1=jnktn.field and @fk_field = 'fieldName1'
LEFT JOIN @jnktn_tbl jnktn ON tbl.Field2=jnktn.field and @fk_field = 'fieldName2'
LEFT JOIN @jnktn_tbl jnktn ON tbl.Field3=jnktn.field and @fk_field = 'fieldName3'
WHERE ad.FK1 <> isnull(a1.ID,0)
选择
广告id
,广告场
,a1.1字段
来自@tblname tbl
在tbl.Field1=jnktn.field和@fk_field='fieldName1'上左键连接@jnktn\u tbl jnktn
在tbl.Field2=jnktn.field和@fk_field='fieldName2'上左键连接@jnktn\u tbl jnktn
在tbl.Field3=jnktn.field和@fk_field='fieldName3'上左键连接@jnktn\u tbl jnktn
其中ad.FK1为空(a1.ID,0)
更新:最后一个例子应该需要一些努力来获得正确的查询,根据您的具体需求,可能根本不起作用。其思想是连接到所有引用的表,并将这些表中的所有字段设置为
NULL
,变量中指定键的表除外 在不太了解为什么或性能要求的情况下,但认识到您想要创建一个动态查询,我建议您考虑使用动态sql重写它?我从来没有听说过动态sql。我来看看。谢谢你的提示。我仍然有这个问题。SQLCMD不工作。我不知道EXEC是否可以工作,因为sql查询还必须设置一些其他变量(我还没有到目前为止)。我不明白您的多连接子句示例在那里做了什么。你能简单解释一下吗?@wullxz我试图解释这个想法,请看最新的答案。EXEC方法(即动态SQL)几乎可以用于任何东西,但调试起来很麻烦。如果启用SQLCMD模式(请参见查询菜单),SQLCMD可与SQLCMD.EXE和查询分析器一起工作。我使用execute语句是因为它是最简单、最灵活的解决方案。