2017-06-15 132 views
1

我有一個常用的分隔符分割字符串起來,並將它們輸出到一個表具有以下結構的表值函數:表值函數,選擇多行

@ValueLookup TABLE 
(
    Value nvarchar(100), 
    ValueIndex int 
) 

我用這主要是爲了分裂組合ID值,如1234-5678

dbo.SplitString('1234-5678', '-') 

目前,我使用兩個SELECT的得到這兩個值一旦被分割,將它們轉換爲整數沿着:

DECLARE @FirstID INT 
DECLARE @SecondID INT 
SELECT 
    @FirstID = CONVERT(INT, Value) 
FROM dbo.SplitString('1234-5678', '-') 
WHERE ValueIndex = 1 
SELECT 
    @SecondID = CONVERT(INT, Value) 
FROM dbo.SplitString('1234-5678', '-') 
WHERE ValueIndex = 2 

有沒有一種方法可以得到兩個值並將它們分配到單個SELECT聲明中?

回答

1
declare @FirstId int, @SecondId int; 
select 
    @FirstID = convert(int,min(case when ValueIndex = 1 then Value end)) 
    , @SecondID = convert(int,min(case when ValueIndex = 2 then Value end)) 
from dbo.SplitString('1234-5678', '-') 

select 
    FirstId = @FirstId 
    , SecondId = @SecondId 

rextester演示:http://rextester.com/TRTDI68038

回報:

+---------+----------+ 
| FirstId | SecondId | 
+---------+----------+ 
| 1234 |  5678 | 
+---------+----------+ 

演示使用值函數由傑夫MODEN與改名函數名和輸出列的CSV分路器表來完成。


分割字符串引用:

+0

優秀的,正是我一直在尋找。我沒有意識到你可以在'CASE'語句中引用另一個行值。因爲我有幾分鐘才能接受,所以我很好奇那裏使用了'MIN'嗎?這只是轉換的一個好習慣嗎? – X3074861X

+0

@ X3074861X'min()'的選擇是任意的。你可以使用'max()'。如果您在聚合函數內而不是在外面轉換爲「int」,則也可以使用sum()。 – SqlZim

1

另一個選擇

Declare @String varchar(max) = '1234-5678' 
Declare @FirstID INT 
Declare @SecondID INT 

Select @FirstID = xDim.value('/x[1]','int') 
     ,@SecondID = xDim.value('/x[2]','int') 
From (Select Cast('<x>' + replace(@String,'-','</x><x>')+'</x>' as xml) as xDim) as A