我有一个名为foo
的模式bar
的视图,我想检索引用。为什么?因为我要改变脚本中的TextBody
属性。为什么SQL SMO没有返回我的View?
我试图检索使用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'];
这个例子是,竟然放弃了我一对夫妇奇怪的错误消息之一。它返回一条消息:如果我将AnsiNullsStatus
属性设置为$true
,那么我收到此消息:To accomplish this action, set property BodyStartIndex.
View
甚至没有名为的属性。
现在,我有两个以上的工作例子:
例3(项目()索引方法)
调用索引的方法,而不是使用索引符号似乎工作就好了。
$ViewTest = $ServerSmo.Databases["dbname"].Views.Item('foo', 'bar');
例4(位置对象)
枚举所有View
对象到PowerShell管道,然后使用Where对象cmdlet似乎工作得很好过滤,但它的效率低下和丑陋。
$ViewTest = $ServerSmo.Databases["dbname"].Views | Where-Object -FilterScript { $_.Name -eq 'foo' and $_.Schema -eq 'bar' };
所以写了这一切之后,我想我的问题或多或少地归结为:为什么不索引符号工作按实施例#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"];
}
}
}
真的吗?这正是为我返回一个$ null [Object []]的东西。 –
是的,我刚刚确认它,$ view是Object [] –
但是我的$ null,而你实际上包含一个SMO视图?我希望调用GetType()应该返回'[Microsoft.SqlServer.Management.Smo.View]' –