Powershell Invoke-Sqlcmd не захватывает весь подробный вывод
Я создал следующий скрипт powershell (v2), чтобы выполнить запрос к целевой базе данных и построить другой запрос / запросы для запуска:
$sql = @"
DECLARE @Tables CURSOR;
DECLARE @TableName NVARCHAR(200);
BEGIN
SET @Tables = CURSOR FOR
SELECT TABLE_NAME
FROM test.INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME LIKE 'x%'
OPEN @Tables
FETCH NEXT FROM @Tables
INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT 'SELECT TOP 1 * FROM test.dbo.' + @TableName
FETCH NEXT FROM @Tables
INTO @TableName
END;
CLOSE @Tables ;
DEALLOCATE @Tables;
END;
"@
$ps = [PowerShell]::Create()
$ps.AddCommand("Invoke-Sqlcmd").AddParameter("Query", $sql).AddParameter("Verbose")
$ps.Invoke()
$sqlOutput = $ps.Streams.Verbose
$sqlOutputToRun = $nul
$sqlOutput | foreach {
$sqlOutputToRun += ($_.ToString() + "`n")
}
$sqlOutputToRun = @"
$sqlOutputToRun
"@
$sqlOutputToRun
В конце скрипта я печатаю запросы, которые должны быть выполнены, но, к сожалению, переменная $sqlOutputToRun содержит только около 3/4 ожидаемого вывода. Я предполагаю, что выходной файл каким-то образом обрезается из-за размера, но я не уверен, как его расширить.
Вы знаете, чего не хватает?
2 ответа
Решение
Если вы не можете жить без курсора, почему вы не можете сделать что-то подобное?
$sql = "
DECLARE @Tables CURSOR;
DECLARE @TableName NVARCHAR(200);
DECLARE @Results TABLE (ResultQuery NVARCHAR(MAX))
BEGIN
SET @Tables = CURSOR FOR
SELECT TABLE_NAME
FROM testdb.INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
--AND TABLE_NAME LIKE 'x%'
OPEN @Tables
FETCH NEXT FROM @Tables
INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO @Results (ResultQuery)
SELECT 'SELECT TOP 1 * FROM test.dbo.' + @TableName
-- PRINT 'SELECT TOP 1 * FROM test.dbo.' + @TableName
FETCH NEXT FROM @Tables
INTO @TableName
END;
CLOSE @Tables ;
DEALLOCATE @Tables;
END;
SELECT * FROM @Results;"
$sqlOutputToRun = Invoke-Sqlcmd -query $sql
$sqlOutputToRun
И как только вы бросаете print
В выражениях в пользу результирующего набора вы также можете сбросить курсор и просто выполнить простой запрос, например:
select 'SELECT TOP (1) * FROM '+ quotename(table_catalog) + '.' + quotename(table_schema) + '.' + quotename(table_name)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
AND TABLE_NAME LIKE 'x%'
так в Powershell:
$sql = @"
select 'SELECT TOP (1) * FROM '+ quotename(table_catalog) + '.' + quotename(table_schema) + '.' + quotename(table_name)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
-- AND TABLE_NAME LIKE 'x%'
"@
$sqlOutputToRun = $nul
invoke-sqlcmd $sql | foreach {
$sqlOutputToRun += $_[0] + "`n"
}
$sqlOutputToRun