Если вам нужно получить скрипт из T-SQL, используйте только xp_cmdshell.Например, создание сценария для конкретного индекса конкретного представления с SMO и powershell (результат в переменной @script, вы можете выполнить его с помощью sp_executesql):
DECLARE @OUTPUT TABLE (line nvarchar(max))
DECLARE @cmd VARCHAR(8000), @ps VARCHAR(8000), @psLoadAssemblies VARCHAR(8000), @script nvarchar(max) =''
DECLARE @srv nvarchar(max)='<server name>',
@ln nvarchar(max)='<login>',
@pw nvarchar(max)='<password>',
@db nvarchar(max) = '<database>',
@schemaName nvarchar(max) = '<schema>', -- without '[' ']'
@viewName nvarchar(max) = '<view name>', -- without '[' ']'
@indexName nvarchar(max) = '<index name>' -- without '[' ']'
SET @psLoadAssemblies = '[System.Reflection.Assembly]::LoadWithPartialName(''Microsoft.SqlServer.SMO'')|Out-Null;'
SET @ps='$using=''Microsoft.SqlServer.Management.Smo'';$s=new-object($using+''.Server'') $srv;$c = $s.ConnectionContext;$c.LoginSecure=$false;$c.Login=$ln;$c.Password=$pw; Write-Host ($s.Databases[$db].Views.Item($viewName,$schemaName).Indexes[$indexName].Script())'
SET @ps=REPLACE(@ps,'$srv',''''+@srv+'''')
SET @ps=REPLACE(@ps,'$ln',''''+@ln+'''')
SET @ps=REPLACE(@ps,'$pw',''''+@pw+'''')
SET @ps=REPLACE(@ps,'$db',''''+@db+'''')
SET @ps=REPLACE(@ps,'$schemaName',''''+@schemaName+'''')
SET @ps=REPLACE(@ps,'$viewName',''''+@viewName+'''')
SET @ps=REPLACE(@ps,'$indexName',''''+@indexName+'''')
SET @cmd = 'powershell -Command "'+@psLoadAssemblies+@ps+'"'
exec dev.Msg @cmd
INSERT INTO @OUTPUT
exec xp_cmdshell @cmd
SELECT @script+line FROM @OUTPUT
WHERE line is not null
PRINT @script
PS Для тех, кто спрашивает, зачем нам нужны такие хитростиВ некоторых сценариях, например, «импортировать данные с использованием стороннего инструмента», подход «отбросить-воссоздать» работает лучше, чем «включить-отключить» объекты, например, потому что такой сторонний инструмент может вызвать «усечение» и если ваша таблица участвует в привязке к схемев представлении вы получите ошибку стороннего инструмента (усечение таблицы, участвующей в индексированных представлениях, приводит к ошибке, поэтому мы вынуждены отбросить представление со всеми индексами перед импортом и воссоздать его после).