【问题标题】:How to separate a result of one column into multiple columns in T-SQL?如何在 T-SQL 中将一列的结果分成多列?
【发布时间】:2020-06-25 13:29:22
【问题描述】:

我正在尝试获取有关磁盘驱动器、它们的总空间和可用空间(总共 3 列)的信息。我在网上找到了一个与我的需求类似的查询,但该查询需要进行一些修改。我做了他们,但后来卡住了。我无法获得中间列。你能帮我解决这个问题吗?

create table #mainDOScmd (ExecCommand NVARCHAR(500))
insert into #mainDOScmd
EXEC master..xp_cmdshell 'wmic LOGICALDISK where "DriveType=3" get DeviceID, FreeSpace, Size';
select * from #mainDOScmd
CREATE TABLE #TEMP( 
[DriveLetter] VARCHAR(100),
[TotalDriveSpace(GB)] NVARCHAR(500), 
[FreeSpaceOnDrive(GB)] NVARCHAR(500)
)
INSERT INTO #TEMP
SELECT 
LEFT(ExecCommand, PATINDEX('%  %',ExecCommand)),
LTRIM(RIGHT(ExecCommand,LEN(ExecCommand)-PATINDEX('%  %',ExecCommand))), --problematic part
LTRIM(RIGHT(LTRIM(RIGHT(ExecCommand,LEN(ExecCommand)-PATINDEX('%  %',(ExecCommand)))), LEN(LTRIM(RIGHT(ExecCommand,LEN(ExecCommand)-PATINDEX('%  %',(ExecCommand))))) - PATINDEX('%  %',LTRIM(RIGHT(ExecCommand,LEN(ExecCommand)-PATINDEX('%  %',REVERSE(ExecCommand))))))) 
FROM #mainDOScmd
WHERE ExecCommand IS NOT NULL AND RTRIM(LEFT(ExecCommand, PATINDEX('%  %',ExecCommand))) <> 'DeviceID'
select * from #TEMP
DROP TABLE #TEMP
DROP TABLE #mainDOScmd
GO

【问题讨论】:

    标签: sql string tsql xp-cmdshell


    【解决方案1】:

    这是一个快速的解决方案。只需将有问题的部分中的最后一列值替换为任何内容

    CREATE TABLE #mainDOScmd (ExecCommand NVARCHAR(500))
    
    INSERT INTO #mainDOScmd
    EXEC master..xp_cmdshell 'wmic LOGICALDISK where "DriveType=3" get DeviceID, FreeSpace, Size';
    
    SELECT *
    FROM #mainDOScmd
    
    CREATE TABLE #TEMP (
        [DriveLetter] VARCHAR(100)
        ,[TotalDriveSpace(GB)] NVARCHAR(500)
        ,[FreeSpaceOnDrive(GB)] NVARCHAR(500)
        )
    
    INSERT INTO #TEMP
    SELECT LEFT(ExecCommand, PATINDEX('%  %', ExecCommand))
        ,replace(LTRIM(RIGHT(ExecCommand, LEN(ExecCommand) - PATINDEX('%  %', ExecCommand))), ' ' + LTRIM(RIGHT(LTRIM(RIGHT(ExecCommand, LEN(ExecCommand) - PATINDEX('%  %', (ExecCommand)))), LEN(LTRIM(RIGHT(ExecCommand, LEN(ExecCommand) - PATINDEX('%  %', (ExecCommand))))) - PATINDEX('%  %', LTRIM(RIGHT(ExecCommand, LEN(ExecCommand) - PATINDEX('%  %', REVERSE(ExecCommand))))))), '')
        ,LTRIM(RIGHT(LTRIM(RIGHT(ExecCommand, LEN(ExecCommand) - PATINDEX('%  %', (ExecCommand)))), LEN(LTRIM(RIGHT(ExecCommand, LEN(ExecCommand) - PATINDEX('%  %', (ExecCommand))))) - PATINDEX('%  %', LTRIM(RIGHT(ExecCommand, LEN(ExecCommand) - PATINDEX('%  %', REVERSE(ExecCommand)))))))
    FROM #mainDOScmd
    WHERE ExecCommand IS NOT NULL
        AND RTRIM(LEFT(ExecCommand, PATINDEX('%  %', ExecCommand))) <> 'DeviceID'
    
    SELECT *
    FROM #TEMP
    
    DROP TABLE #TEMP
    
    DROP TABLE #mainDOScmd
    

    【讨论】:

      猜你喜欢
      • 2017-04-16
      • 2011-12-07
      • 2011-11-09
      • 1970-01-01
      • 2016-01-11
      • 2011-06-11
      • 2020-11-18
      • 1970-01-01
      • 2018-12-07
      相关资源
      最近更新 更多