Почему SQL SMO не возвращает мой вид? - PullRequest
2 голосов
/ 13 февраля 2012

У меня есть представление с именем 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"];
        }
    }
}

1 Ответ

2 голосов
/ 13 февраля 2012

Пример # 2 работает для меня (в v3), я могу изменить View TextBody с помощью этого:

$ViewTest = $ServerSmo.Databases['dbname'].Views['foo','bar']
$ViewTest.TextBody='foo'
$ViewTest.Alter()

В v2 $ ViewTest является коллекцией System.Object [], поэтому мне пришлось проиндексировать ее, чтобы установить bosy и вызвать метод alert

$ViewTest = $ServerSmo.Databases['dbname'].Views['foo','bar']
$ViewTest[0].TextBody='foo'
$ViewTest[0].Alter()
...