Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL引用带有变量的外键_Sql_Sql Server_Variables - Fatal编程技术网

SQL引用带有变量的外键

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

我必须检查循环中的几个外键,并且需要用变量(例如@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.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语句是因为它是最简单、最灵活的解决方案。