将 SQL Server 结果转换为 PowerShell 可以访问和使用的文本文件

Vor*_*ter 1 sql-server-2008 sql-server powershell sql-server-2008-r2 sql-server-2012

下面的查询用于创建一个带有服务器名称列表的文本文件。

我遇到的问题是文本文件的创建就像

Server, Server, Server etc.
Run Code Online (Sandbox Code Playgroud)

但我需要它如下

Server
Server
Server
Run Code Online (Sandbox Code Playgroud)

查询:

BEGIN
    CREATE TABLE [TempPSWmiObjectQuery]
                (QueryText nvarchar(max))
END

INSERT INTO [TempPSWmiObjectQuery]

SELECT STUFF((SELECT char(13)+char(10), 
             SUBSTRING(ServerName, 1, 
             CASE WHEN CHARINDEX(',', ServerName) > 0 
                  THEN CHARINDEX(',', ServerName)-1
                  ELSE LEN(ServerName)
             END)
FROM MasterList
FOR XML PATH('')), 1, 1, '')

EXEC sp_configure 'xp_cmdshell', 1;  
RECONFIGURE

EXEC xp_cmdshell 'bcp SQLEnv.dbo.TempPSWmiObjectQuery out "\\ServerName\Data\temp\testlist.txt" -c -T -S "ServerName\Instance"'

EXEC sp_configure 'xp_cmdshell', 0;  
RECONFIGURE

DROP TABLE TempPSWmiObjectQuery
Run Code Online (Sandbox Code Playgroud)

PowerShell 脚本:

        $StagingServer = "ServerName\InstanceName"
        $StagingServerDatabase = "SQLEnv" 

    foreach($line in 
    [System.IO.File]::ReadLines("\\ServerName\Data\temp\testlist.txt"))
    {
        $line
        Get-WmiObject win32_Service -Computer $line  | where {$_.DisplayName 
    -match "SQL Server"} | select SystemName, DisplayName, Name, State, 
    Status, StartMode, StartName | ConvertTo-DbaDataTable | Write- 
    DbaDataTable -SqlInstance $StagingServer -Database 
    $StagingServerDatabase -Table _SQLServicesInfo -AutoCreateTable -Confirm

    }
Run Code Online (Sandbox Code Playgroud)

Ran*_*gen 5

此答案假设ServerName列的单行中有多个逗号,并且需要删除这些逗号并添加换行符 + 回车符而不是每个逗号。

可能有更好的方法来获得最终结果,但是要写入没有逗号的文本文件,您可以使用该REPLACE()函数。

CHARINDEX() 只会给你找到的第一个值的位置。

CREATE TABLE [TempPSWmiObjectQuery](QueryText nvarchar(max));
INSERT INTO [TempPSWmiObjectQuery]
SELECT  REPLACE(ServerName,',',+ ' '+char(13)+char(10) )  -- Replace comma with space, line feed and carriage return.
FROM MasterList;


EXEC sp_configure 'xp_cmdshell', 1;  
RECONFIGURE;

EXEC xp_cmdshell 'bcp SQLEnv.dbo.TempPSWmiObjectQuery out "\\ServerName\Data\temp\testlist.txt" -c -T -S "ServerName\Instance"';

EXEC sp_configure 'xp_cmdshell', 0;  
RECONFIGURE;

DROP TABLE TempPSWmiObjectQuery;
Run Code Online (Sandbox Code Playgroud)

测试

INSERT INTO MasterList(ServerName)
VALUES('Server1,Server2,Server3')
Run Code Online (Sandbox Code Playgroud)

结果 在此处输入图片说明

如果您不想要换行,请更改SELECT REPLACE(ServerName,',',+ ' '+char(13)+char(10) )SELECT REPLACE(ServerName,',',+ ' ' )