我有一個查詢分開大括號之間的accounid和dbids。 例如:[14801].[42]
拆分大括號之間的accounid和dbids成兩列
acid scid
14801 42
,但我不能逗號,
例如後分離:
[27784].[41],[27781].[41],[27779].[41]
需要查詢這些數據分成數行
我有一個查詢分開大括號之間的accounid和dbids。 例如:[14801].[42]
拆分大括號之間的accounid和dbids成兩列
acid scid
14801 42
,但我不能逗號,
例如後分離:
[27784].[41],[27781].[41],[27779].[41]
需要查詢這些數據分成數行
您需要創建功能到的值分成行
create function [dbo].[udf_splitstring] (@tokens varchar(max),
@delimiter varchar(5))
returns @split table (
token varchar(200) not null)
as
begin
declare @list xml
select @list = cast('<a>'
+ replace(@tokens, @delimiter, '</a><a>')
+ '</a>' as xml)
insert into @split
(token)
select ltrim(t.value('.', 'varchar(200)')) as data
from @list.nodes('/a') as x(t)
return
end
select * from into #a udf_splitstring ('[27784].[41],[27781].[41],[27779].[41]',',')
輸出
[27784].[41]
[27781].[41]
[27779].[41]
未來結果存儲在一個臨時表
SELECT TOKEN,REPLACE(REPLACE(SUBSTRING(TOKEN,0,CHARINDEX('.',TOKEN)),'[',''),']','') AS first_id
,REPLACE(REPLACE(REVERSE(SUBSTRING(REVERSE(TOKEN),0,CHARINDEX('.',REVERSE(TOKEN)))),'[',''),']','') AS second_id
FROM #a
輸出
TOKEN first_id second_id
[27784].[41] 27784 41
[27781].[41] 27781 41
[27779].[41] 27779 41
試試這個:
DECLARE @START_ID VARCHAR(100)='[27784].[41],[27781].[41],[27779].[41]'
DECLARE @ID VARCHAR(MAX)
DECLARE @COUNT INT
DECLARE @TEMP TABLE(C1 VARCHAR(MAX))
WHILE(CHARINDEX(',',@START_ID))>0
BEGIN
INSERT INTO @TEMP SELECT SUBSTRING(@START_ID,0,CHARINDEX(',',@START_ID))
SET @START_ID=(SELECT REPLACE(@START_ID,(SUBSTRING(@START_ID,0,CHARINDEX(',',@START_ID)+1)),''))
END
INSERT INTO @TEMP SELECT @START_ID
SELECT C1,REPLACE(REPLACE(SUBSTRING(C1,0,CHARINDEX('.',C1)),'[',''),']','') AS SOURCE_ACCOUT_ID
,REPLACE(REPLACE(REVERSE(SUBSTRING(REVERSE(C1),0,CHARINDEX('.',REVERSE(C1)))),'[',''),']','') AS SOURCE_DATABASE_ID
FROM @TEMP
select n.ids.value ('id[1]','int') as accountid
,n.ids.value ('id[2]','int') as dbid
from (select cast (replace('<r><e><id>'+replace(replace(replace(
ids,'[',''),']',''),',','</id></e><e><id>')+
'</id></e></r>','.','</id><id>') as xml) as x
from mytable
) t
cross apply x.nodes ('/r/e') n(ids)
+-----------+------+
| accountid | dbid |
+-----------+------+
| 27784 | 41 |
+-----------+------+
| 27781 | 41 |
+-----------+------+
| 27779 | 41 |
+-----------+------+
| 28021 | 30 |
+-----------+------+
| 28024 | 30 |
+-----------+------+
| 29007 | 56 |
+-----------+------+
DDL + DML用於演示
create table mytable (ids varchar(1000))
insert into mytable values
('[27784].[41],[27781].[41],[27779].[41]')
, ('[28021].[30],[28024].[30]')
, ('[29007].[56]')