构建动态T-SQL

时间:2011-04-27 18:44:34

标签: sql sql-server dynamic-sql

我对使用MS SQL Server的SQL有疑问

我有一张桌子

customer
id  country_id post_code_id
1      AU          1
2      GB          1

我把邮政编码表分开了

post_codes_AU
post_codes_GB
etc..

有没有办法可以在查询中使用country_id加入正确的表格...例如,

select * from customer c
inner join post_codes_ '+c.country_id+' as pc on pc.id=c.post_code_id 

4 个答案:

答案 0 :(得分:1)

您无法像这样加入查询。

要进行正确的查询,您可以执行以下操作之一:

  • 在post_codes _...表格上创建分区视图并加入此视图
  • 为customer表中的每个country_id生成查询,并将其与UNION ALL语句粘合在一起。

答案 1 :(得分:0)

如果您的示例查询建议的名称中确实有空格,则需要在表名周围添加[]。这看起来像一个错字,所以你可能不需要这样做。一旦你这样做,它应该可以作为动态SQL工作。

在您走这条路线之前,请确保您知道使用动态SQL的潜在pifall。值得一读:

http://www.sommarskog.se/dynamic_sql.html

答案 2 :(得分:0)

创建视图并加入;

-- #1 create a view . . . .
create view MyPostCodes

as

select
    country_id='AU',
    post_code_id
from
    post_codes_AU
union
select
    country_id='GB',
    post_code_id
from
    post_codes_GB
go
-- #2 now join like this
select * from customer c
inner join MyPostCodes as pc on pc.id=c.post_code_id and pc.country_id=c.country_id

答案 3 :(得分:0)

看起来您的查询会有效,稍有改动。

;with cte as (
   select 
    [STOCK NO]    
  , u.rev
  , bomEntry = row_number() over (order by u.ordinal)
  , u.Partid
  , Qty='1'
  , cmnt = 'TEST'
  , srcLoc = 'TEST'
  , dType = '0'
  , lead = '0'
  , lineNbr = row_number() over (order by u.ordinal)
  , RevControl
from [inserted]
  cross apply (values 
     ([bomRev],1,[BOM-WHEEL PN])
    ,([bomRev],2,[BOM - RIM])
    ,([bomRev],3,[BOM - SECONDARY DISC PN])
    ,([bomRev],4,[BOM - FIN DISC PN])
    ,([bomRev],5, [BOM - FLAT FIN DISC PN])
    ,([bomRev],6,[WHL BOM PART 1 PN])
    ,([bomRev],7,[WHL BOM PART 2 PN])
    ,([bomRev],8,[WHL BOM PART 3 PN])
    ,([bomRev],9,[WHL BOM PART 4 PN])
    ,([bomRev],10,[WHL BOM PART 5 PN])
    ,([bomRev],11,[COLOR-PN])
  ) u (rev, ordinal, partId)
where nullif(u.partId, '') is not null 
)

INSERT INTO WITESTCO.dbo.[WIBOMD] 
   ([bomItem], [bomRev], [bomEntry], [partId], [qty],[cmnt],[srcLoc],[dType],[lead],[lineNbr])
   select 
    cte.[STOCK NO]
  , cte.rev
  , cte.bomEntry
  , cte..Partid
  , cte.Qty
  , cte.cmnt
  , cte.srcLoc
  , cte.dType
  , cte.lead
  , cte.lineNbr
from cte
where not exists (
    select 1
    from WITESTCO.dbo.[WIBOMD] w
    where w.[bomItem] = cte.[STOCK NO]
      and w.[bomRev]  = cte.[RevControl]
      and w.[bomEntry]= cte.bomEntry
  );

或尝试下面的代码,

Select * from customer c 
Inner Join post_codes
On concat('post_codes_',c.country_id)=Post_codes.post_code_id

在比较之前删除要比较的确切代码。