SQL Server 2008存储过程中的动态SQL查询

时间:2017-08-31 18:08:03

标签: sql-server sql-server-2008 sql-server-2008-r2

我有4张桌子A,B,C和X.

X 表:

Icid    Trade_Id    Counter_Party
---------------------------------
1         101       HDFC1
2         102       HDFC1
3         103       HDFC2
4         104       HDFC2
5         105       HDFC2
6         106       HDFC3
7         107       HDFC4
8         108       HDFC4
9         109       HDFC5
10        110       HDFC5

A 表格:

Icid    Trade_Id      Name
----------------------------------
 1       110          HDFC Bank Pvt Ltd
 2       105          HDFC Bank Pvt Ltd
 3       101          HDFC Bank Pvt Ltd
 4       102          HDFC Bank Pvt Ltd

B 表:

Icid    Trade_Id    Name
----------------------------------------
 1        103       HSBC Pvt Ltd
 2        104       HSBC Pvt Ltd
 3        106       HSBC Pvt Ltd

C 表:

Icid    Trade_Id    Name
--------------------------------------
 1       107        HK Pvt Ltd
 2       108        HK Pvt Ltd
 3       109        HK Pvt Ltd

这样的A,B,C表,我创建了另一个表并存储表名,如下所示。

Findtbl 表:

    Icid    Table_name
    ------------------
     2       A
     3       B
     4       C

我需要将 X Trade_ID表找到表A,B和C.如果在表A中找到,则打印位置列INDIA,如果在表B中找到然后打印位置列USA,如果在表C中找到,则Hongkong表位置,Trade_Id,名称列中的位置列为#Temp

#temp 表格:

Icid    location    Trade_Id    Name

我试过了:

Declare @Fst_value nvarchar(100)
Declare @Counter INT
Declare @tablename nvarchar(20)
Declare @sql nvarchar(max)
Declare @isvalue int
Declare @loop int = 1
Declare @sqlsecond nvarchar(max)
Declare @sqlthird nvarchar(max)

SET @Fst_value = '104'
SET @Counter = (Select COUNT(Icid) From Findtbl)

WHILE @Loop < = @Counter
BEGIN
    SET @tablename = (SELECT Table_name 
                      FROM Findtbl 
                      WHERE Icid = @Loop)
    SET @sql = 'Select @isvalue = Icid,@sqlsecond = Trade_Id,@sqlthird = Name  From '+@tablename+' Where Trade_Id = '+@Fst_value+''

    Execute sp_executesql @sql,N'@isvalue int OUTPUT,@sqlsecond nvarchar OUTPUT,@sqlthird nvarchar OUTPUT',@isvalue = @isvalue OUT,@sqlsecond  = @sqlsecond OUT,@sqlthird = @sqlthird OUT

    if(@isvalue <> 0)
    begin
        Select @sql
        break
    end

    SET @isvalue = 0
    SET @Loop = @Loop + 1
END

此代码包含在存储过程中。

1 个答案:

答案 0 :(得分:0)

我会试一试,但你可能需要花点时间重新陈述你的问题。

我将不得不忽略程序代码,并使用基于集合的代码。

insert into #temp (Icid, location, Trade_Id, Name)
select case
    when A.Trade_ID is not null then A.Icid
    when B.Trade_ID is not null then B.Icid
    when C.Trade_ID is not null then C.Icid
end
,case
    when A.Trade_ID is not null then 'INDIA'
    when B.Trade_ID is not null then 'USA'
    when C.Trade_ID is not null then 'Hongkong'
end
,case
    when A.Trade_ID is not null then A.Trade_ID
    when B.Trade_ID is not null then B.Trade_ID
    when C.Trade_ID is not null then C.Trade_ID
end
,case
    when A.Trade_ID is not null then A.Name
    when B.Trade_ID is not null then B.Name
    when C.Trade_ID is not null then C.Name
end
from X
left outer join A on X.Trade_ID on A.Trade_ID
left outer join B on X.Trade_ID on B.Trade_ID
left outer join C on X.Trade_ID on C.Trade_ID