2012-02-13 19 views
2

我有一个名为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"]; 
     } 
    } 
} 

回答

2

例2的作品,我(在v3中),我可以用这个来改变观看的TextBody:

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

在V2 $ ViewTest是系统的集合。对象[]所以我不得不索引它来设置bosy并调用alert方法

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

真的吗?这正是为我返回一个$ null [Object []]的东西。 –

+0

是的,我刚刚确认它,$ view是Object [] –

+0

但是我的$ null,而你实际上包含一个SMO视图?我希望调用GetType()应该返回'[Microsoft.SqlServer.Management.Smo.View]' –

相关问题