反转交叉连接输入

时间:2013-01-23 21:03:50

标签: c# sql sql-server tsql

表格由以下存储过程填充:

exec('
insert into tblSegments
    (SegmentName, CarTypeID, EngineTypeID, AxleTypeID)
select distinct
    ''' + @SegmentName + '''
    , CT.CarTypeID
    , ET.EngineTypeID
    , AT.AxleTypeID
from
    tblCarTypes CT
        cross join tblEngineTypes ET
        cross join tblAxleTypes AT
where
    CT.CarTypeName in (' + @CarTypes + ')
    and ET.EngineTypeName in (' + @EngineTypes + ')
    and AT.AxleTypeName in (' + @AxleTypes + ')
')

参数(@SegmentName除外)是字符串,例如(@CarTypes'hatchback','suv','sedan'

表中的数据是否可用于为单个SegmentName创建存储过程的先前条目的列表

Run1:@ CarTypes,@ EngineTypes,@ AxleTypes
Run2:@ CarTypes,@ EngineTypes,@ AxleTypes
Run3:@ CarTypes,@ EngineTypes,@ AxleTypes

...

运行不需要按顺序排列。该过程可能涉及T-SQL和C#的组合。我很确定这是不可能的;也许有人可以证明我错了。

1 个答案:

答案 0 :(得分:1)

不,这是不可能的,因为您正在接受可能以逗号分隔的值字符串,这些值将在结果表中创建单独的行。您可以轻松地为CarTypes,EngineTypes和AxleTypes变量分别获取单个值,但是每次执行动态SQL时需要单独对它们进行分组,您需要某种executionID列或者每次执行时对行进行分组。

所以你是正确的,因为你想要做的事情是完全可能的,但不是你提供的架构设计。我想创建另一个表并在运行时填充它,如果这是您想要保留的信息。您可以在包含输入变量的表上放置一个标识列,并使用@@ IDENTITY插入该表以填充主表中的executionID列,以便您可以轻松地将变量摘要表与交叉连接结果表关联