Sql server 2008 f值(例如,我认为OP在我们的例子中是指3)则不需要动态查询。如果数字小于5(0-4),则不需要用户定义的拆分函数,最好的解决方案是使用PARSENAME。请阅读我的答案:-)这是所有解释那里。任何半体面的字符串拆分器应该能够处理,即使没有深度值。但是,如
Sql server 2008 f值(例如,我认为OP在我们的例子中是指3)则不需要动态查询。如果数字小于5(0-4),则不需要用户定义的拆分函数,最好的解决方案是使用PARSENAME。请阅读我的答案:-)这是所有解释那里。任何半体面的字符串拆分器应该能够处理,即使没有深度值。但是,如,sql-server-2008,tsql,string-parsing,Sql Server 2008,Tsql,String Parsing,f值(例如,我认为OP在我们的例子中是指3)则不需要动态查询。如果数字小于5(0-4),则不需要用户定义的拆分函数,最好的解决方案是使用PARSENAME。请阅读我的答案:-)这是所有解释那里。任何半体面的字符串拆分器应该能够处理,即使没有深度值。但是,如果试图将多值参数传递给存储过程,则表值参数应该更好this@axmim不,不是。还有其他方法。@AXMIM,只有在每个字符串中的值数目未知时才需要动态查询。那样的话,你是对的。但是,如果您知道最大值的数目(例如,我认为OP在我们的例子中的意思是
f值(例如,我认为OP在我们的例子中是指3)则不需要动态查询。如果数字小于5(0-4),则不需要用户定义的拆分函数,最好的解决方案是使用PARSENAME。请阅读我的答案:-)这是所有解释那里。任何半体面的字符串拆分器应该能够处理,即使没有深度值。但是,如果试图将多值参数传递给存储过程,则表值参数应该更好this@axmim不,不是。还有其他方法。@AXMIM,只有在每个字符串中的值数目未知时才需要动态查询。那样的话,你是对的。但是,如果您知道最大值的数目(例如,我认为OP在我们的例子中的意思是3),那么就不需要动态查询。如果数字小于5(0-4),则不需要用户定义的拆分函数,最好的解决方案是使用PARSENAME。请阅读我的答案:-)所有的解释都在这里。请看问题的最后一行:“在上面的例子中,最大深度是3,但在现实世界中它可能是N个数字。”谢谢,我没有注意到这句话:-)在这种情况下,最好的选择是动态查询,当您使用SQLCLR SPLIT function编写SPLIT function时,是否有一种方法可以在不使用动态sql的情况下透视未知数量的列?请参见问题的最后一行:“在上面的示例中,最大深度为3,但在现实世界中可能是N个数字。”谢谢,我没有注意到这句话:-)在这种情况下,最好的选择是动态查询,当您使用SQLCLR SPLIT function编写SPLIT function时,是否有一种方法可以在不使用动态sql的情况下透视未知数量的列?请参见问题的最后一行:“在上面的示例中,最大深度为3,但在现实世界中可能是N个数字。”谢谢,我没有注意到这句话:-)在这种情况下,最好的选择是动态查询,当您使用SQLCLR SPLIT function编写SPLIT函数时,是否有一种方法可以在不使用动态sql的情况下透视未知数量的列?
Tree Depth
URL1||URL2 2
URL2||URL3 2
URL3||URL4||URL5 3
URL1||URL2||URL3 3
COL1 COL2 COL3 DEPTH
URL1 URL2 2
URL2 URL3 2
URL3 URL4 URL5 3
URL1 URL2 URL3 3
SELECT PARSENAME(REPLACE(Tree,'||','.'), 1) as col1, PARSENAME(REPLACE(Tree,'||','.'), 2) as col2, PARSENAME(REPLACE(Tree,'||','.'), 3) as col3, Depth
from TableName
Declare @Delimiter nvarchar(10) = '||'
Declare @InputTable nvarchar(2000) = '<<input table name>>'
Declare @OutputTable nvarchar(2000) = '<<output table name>>'
Declare @ColumnToSplit nvarchar(2000) = '<<column to split>>'
Declare @lsql nvarchar(max)
Declare @treeDepth int
If Object_id('dbo.treeDepth') is not null
Drop table dbo.treeDepth
CREATE TABLE dbo.treeDepth (depth INT)
declare @ltext nvarchar(max)= 'Select max(1+(len('+@ColumnToSplit+')- len(Replace('+@ColumnToSplit+','''+@Delimiter+''','''')))/(len('''+@Delimiter+'''))) from '+@InputTable
insert dbo.treeDepth EXEC(@ltext)
Select @lsql = isnull(@lsql+',','') +
'xmlname.value(''/Node[1]/Node['+cast(number+1 as nvarchar)+']'',''varchar(1000)'') AS Col_'+cast(number+1 as nvarchar)+''
from master..spt_values where type = 'P' and number < (Select * from dbo.treeDepth)
set @lsql = '
WITH ForXML
AS
(
SELECT *,
CONVERT(XML,''<Node><Node>''
+ REPLACE('+@ColumnToSplit+','''+@Delimiter+''', ''</Node><Node>'') + ''</Node></Node>'') AS xmlname
FROM '+@InputTable+'
)
Select *, '+@lsql+' Into '+@OutputTable+' From ForXML
Alter table '+@OutputTable+'
Drop column xmlname
'
EXEC(@lsql)