我在架构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"];
}
}
}
答案 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()