2010-08-10 78 views

回答

0

我endup使用foreach <insert>

1

Arrays and Lists in SQL Server 2008看看得到一些想法

SQL Server 2008還支持這種多行值語法在SQL Server之前,表的可用性解決這個2005年(

create table #bla (id int, somename varchar(50)) 

insert #bla values(1,'test1'),(2,'Test2') 

select * from #bla 
+0

如果你加一點適用的內容你的答案,從該鏈接的頁面,如果可能的話很高興。除非你知道這個頁面永遠不會消失。 – thursdaysgeek 2010-08-10 20:23:19

+0

我看着它之前我發佈在這裏,我使用LINQ到SQL,我想做的一切在SQL服務器端。 – 2010-08-10 20:25:27

2

的一種方式有價值的參數)是通過一個分隔列表並使用Split功能。如果你使用的是兩列的陣列,您可能需要使用兩個不同的分隔符:

Declare @Values varchar(max) 
Set @Values = '1,abc|2,bbc|3,cnn' 

With SplitItems As 
    (
    Select S.Value As [Key] 
     , S2.Value 
     , Row_Number() Over (Partition By S.Position Order By S2.Position) As ElementNum 
    From dbo.Split(@Values,'|') As S 
     Outer Apply dbo.Split(S.Value, ',') As S2 
    ) 
Select [Key] 
    , Min(Case When S.ElementNum = 1 Then S.Value End) As ListKey 
    , Min(Case When S.ElementNum = 2 Then S.Value End) As ListValue 
From SplitItems As S 
Group By [Key] 

Create Function [dbo].[Split] 
( 
    @DelimitedList nvarchar(max) 
    , @Delimiter nvarchar(2) = ',' 
) 
RETURNS TABLE 
AS 
RETURN 
    (
    With CorrectedList As 
     (
     Select Case When Left(@DelimitedList, Len(@Delimiter)) <> @Delimiter Then @Delimiter Else '' End 
      + @DelimitedList 
      + Case When Right(@DelimitedList, Len(@Delimiter)) <> @Delimiter Then @Delimiter Else '' End 
      As List 
      , Len(@Delimiter) As DelimiterLen 
     ) 
     , Numbers As 
     (
     Select Row_Number() Over (Order By c1.object_id) As Value 
     From sys.columns As c1 
      Cross Join sys.columns As c2 
     ) 
    Select CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen As Position 
     , Substring (
        CL.List 
        , CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen  
        , CharIndex(@Delimiter, CL.list, N.Value + 1)       
         - (CharIndex(@Delimiter, CL.list, N.Value) + CL.DelimiterLen) 
        ) As Value 
    From CorrectedList As CL 
     Cross Join Numbers As N 
    Where N.Value < Len(CL.List) 
     And Substring(CL.List, N.Value, CL.DelimiterLen) = @Delimiter 
    ) 

另一種方式來處理這個不表值參數是通過XML作爲一個nvarchar(最大):

Declare @Values nvarchar(max) 
Set @Values = '<root><Item Key="1" Value="abc"/> 
<Item Key="2" Value="bbc"/> 
<Item Key="3" Value="cnn"/></root>' 

Declare @docHandle int 
exec sp_xml_preparedocument @docHandle output, @Values 

Select * 
From OpenXml(@docHandle, N'/root/Item', 1) 
    With([Key] int, Value varchar(10)) 
+0

太多的代碼:.... – 2010-08-11 17:23:53

+0

@Nisar汗 - 這聽起來很像「太多筆記」。如果你使用XML,你只需要三行代碼(我把這個查詢當作一行代碼)。在第一種解決方案中,一旦創建了拆分功能(一次只發生一次操作),您又會下降到三行代碼。 – Thomas 2010-08-11 18:37:00