У меня есть представление с именем foo
в схеме bar
, на которое я хочу получить ссылку. Зачем? Потому что я собираюсь изменить свойство TextBody
в скрипте.
Я пытаюсь получить ссылку на представление, используя SMO. До сих пор я пробовал два разных метода; один метод возвращает нулевое значение для представления, а другой - пару странных сообщений об ошибках.
Пример 1 (создание представления)
Все значения на объекте являются нулевыми, поэтому я предполагаю, что создание экземпляра объекта View
предназначено только для создания нового представления.
$ViewTest = New-Object -TypeName Microsoft.SqlServer.Management.Smo.View -ArgumentList $ServerSmo.Databases["dbname"], 'foo', 'bar';
(обратите внимание, что $ServerSmo
является объектом Smo.Server)
Пример 2 (обозначение индексатора)
Это должно работать. На основе индексатора элементов ViewCollection
: MSDN Link
$ViewTest = $ServerSmo.Databases["dbname"].Views['foo', 'bar'];
Этот пример дает мне пару странных сообщений об ошибках. Он возвращает сообщение: To accomplish this action, set property AnsiNullsStatus.
Если я установлю для свойства AnsiNullsStatus
значение $true
, то получу следующее сообщение: To accomplish this action, set property BodyStartIndex.
View
даже не имеет свойства с таким именем.
Теперь у меня есть еще два примера:
Пример 3 (метод индексирования Item ())
Вызов индексатора как метода вместо использования записи индексатора, кажется, работает очень хорошо.
$ViewTest = $ServerSmo.Databases["dbname"].Views.Item('foo', 'bar');
Пример 4 (Где-Объект)
Перечисление всех объектов View
в конвейер PowerShell, а затем фильтрация с помощью командлета Where-Object, кажется, работают нормально, но неэффективно и уродливо.
$ViewTest = $ServerSmo.Databases["dbname"].Views | Where-Object -FilterScript { $_.Name -eq 'foo' and $_.Schema -eq 'bar' };
Итак, после написания всего этого, я думаю, мой вопрос более или менее сводится к тому, почему нотация Indexer не работает так, как в Примере № 2?
ОБНОВЛЕНИЕ: Я написал некоторый код на C #, который, похоже, прекрасно восстанавливает представление.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SqlServer.Management.Smo;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
var server = new Server(".");
var db = server.Databases["dbname"];
var view = db.Views["foo", "bar"];
}
}
}