【问题标题】:How to split dynamic variable values to individual column?如何将动态变量值拆分为单个列?
【发布时间】:2017-06-26 10:58:36
【问题描述】:

我有以下代码返回具有以下值的变量@colsrate:

'[5.00],[5.00],[1.00],[35.00],[1.00],[1.00],[1.00],[1.00],[1.00],[1.00]' 

我需要将这些单独的值转换为单独的列。我怎样才能做到这一点?谢谢。

SELECT 
    CAST((CAST(Rate AS DECIMAL(18,2))) AS NVARCHAR(255))AS Rate 
    ,LEFT((CAST(StartDate AS NVARCHAR(255))), 11) AS StartDate
    INTO #TempTab
    FROM RepoCost.vwCurrencyRate
WHERE 
    CurrencyNameFrom = @CurrencyNameFrom
AND 
    CurrencyNameTo=@CurrencyNameTo
AND 
    DimdateId= @DimdateId

SET @colsrate =  STUFF((SELECT ','+QUOTENAME(Rate)
                    FROM #TempTab
      FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)') 
,1,1,'')

【问题讨论】:

  • 添加预期输出
  • 预期输出:选择 '[5.00]' ,'[5.00]' ,'[1.00]' ,'[35.00]' ,'[1.00]','[1.00]','[ 1.00]','[1.00]','[1.00]','[1.00]'

标签: sql sql-server sql-server-2008


【解决方案1】:

在下面试试这个

IF OBJECT_ID('Tempdb..#Temp') IS NOT NULL
Drop table #Temp
Declare @DyValue TABLE (Value nvarchar(max))
INSERT INTO @DyValue(Value)
SELECT '[5.00],[5.00],[1.00],[35.00],[1.00],[1.00],[1.00],[1.00],[1.00],[1.00]' 

Declare @DynamicCol nvarchar(max),@Sql nvarchar(max)

SELECT * INTO #Temp FROM
(
SELECT Row_number()Over(Order by (SELECT NULL)) AS ID,Split.a.value('.', 'VARCHAR(1000)') AS Value
            FROM  (
                SELECT  CAST('<S>' + REPLACE(Value, ',', '</S><S>') + '</S>' AS XML) AS Value
                FROM @DyValue
                ) AS A
            CROSS APPLY Value.nodes('/S') AS Split(a)
            )Dt


    SELECT @DynamicCol=STUFF((SELECT ', ' + ''''+CAST( Value AS Varchar(10))+'''' From #Temp
            FOR XML PATH ('')),1,1,'')  
            SELECT @DynamicCol AS ExpectedValue

    SET @Sql ='SELECT '+@DynamicCol 
    EXECUTE @Sql
    PRINT @Sql

如下图所示

SELECT  '[5.00]', '[5.00]', '[1.00]', '[35.00]', '[1.00]', '[1.00]', '[1.00]', '[1.00]', '[1.00]', '[1.00]'

【讨论】:

    【解决方案2】:

    这段代码不是我的。这是 John Cappelletti 的解决方案 (here's the original link)

    但可以完美满足您的需求

    Declare @YourTable table (SomeCol varchar(max))
    Insert Into @YourTable values
    ('[5.00],[5.00],[1.00],[35.00],[1.00],[1.00],[1.00],[1.00],[1.00],[1.00]')
    
    
    Select B.*
     From  @YourTable A
     Cross Apply (
                    Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
                          ,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
                          ,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
                          ,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
                          ,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
                          ,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
                          ,Pos7 = ltrim(rtrim(xDim.value('/x[7]','varchar(max)')))
                    From  (Select Cast('<x>' + replace((Select replace(A.SomeCol,',','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
                 ) B
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-04
    • 2012-10-09
    • 2018-01-15
    • 1970-01-01
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多