我在List<T>
中有一個名稱/值對,並且需要找到將這些傳遞給存儲過程的最佳方法。將名稱/值對列表傳遞到存儲過程
Id Name
1 abc
2 bbc
3 cnn
....
...
完成此操作的最佳方法是什麼?
我在List<T>
中有一個名稱/值對,並且需要找到將這些傳遞給存儲過程的最佳方法。將名稱/值對列表傳遞到存儲過程
Id Name
1 abc
2 bbc
3 cnn
....
...
完成此操作的最佳方法是什麼?
我endup使用foreach <insert>
在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
的一種方式有價值的參數)是通過一個分隔列表並使用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))
太多的代碼:.... – 2010-08-11 17:23:53
@Nisar汗 - 這聽起來很像「太多筆記」。如果你使用XML,你只需要三行代碼(我把這個查詢當作一行代碼)。在第一種解決方案中,一旦創建了拆分功能(一次只發生一次操作),您又會下降到三行代碼。 – Thomas 2010-08-11 18:37:00
如果你加一點適用的內容你的答案,從該鏈接的頁面,如果可能的話很高興。除非你知道這個頁面永遠不會消失。 – thursdaysgeek 2010-08-10 20:23:19
我看着它之前我發佈在這裏,我使用LINQ到SQL,我想做的一切在SQL服務器端。 – 2010-08-10 20:25:27