为什么SQL SMO不返回我的View?

时间:2012-02-13 15:30:51

标签: sql-server sql-server-2008 powershell powershell-v2.0 smo

我在架构foo中有一个名为bar的视图,我想要检索对它的引用。为什么?因为我要改变脚本中的TextBody属性。

我正在尝试使用SMO检索对视图的引用。到目前为止,我尝试了两种不同的方法;一个方法是为View返回一个空值,另一个方法是给出一对奇怪的错误信息。

示例1(实例化视图)

对象上的所有值都为null,因此我想实例化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(项目()索引方法)

将索引器称为方法而不是使用索引器表示法似乎工作正常。

$ViewTest = $ServerSmo.Databases["dbname"].Views.Item('foo', 'bar');

示例4(Where-Object)

将所有View对象枚举到PowerShell管道中,然后使用Where-Object cmdlet进行过滤似乎工作正常,但效率低且难看。

$ViewTest = $ServerSmo.Databases["dbname"].Views | Where-Object -FilterScript { $_.Name -eq 'foo' and $_.Schema -eq 'bar' };

因此,在写完所有这些之后,我想我的问题或多或少归结为:为什么Indexer表示法不像示例#2那样工作?

更新:我写了一些C#代码,这似乎可以很好地检索View。

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 个答案:

答案 0 :(得分:2)

示例#2适用于我(在第3版中),我可以使用以下命令更改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()