我在架构 bar
中有一个名为 foo
的 View ,我想检索对其的引用。为什么?因为我要更改脚本中的 TextBody
属性。
我正在尝试使用 SMO 检索对 View 的引用。到目前为止我已经尝试了两种不同的方法;一种方法返回 View 的空值,另一种方法给出一些奇怪的错误消息。
示例 1(实例化 View )
该对象上的所有值都是 null,所以我猜实例化一个 View
对象只是为了创建一个新的 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。
如果我将 AnsiNullsStatus
属性设置为 $true
,那么我会得到以下信息message: 要完成此操作,请设置属性 BodyStartIndex。
View
甚至没有名为该属性的属性。
现在,我还有两个有效的示例:
示例 3(Item() 索引器方法)
将索引器作为方法调用而不是使用索引器表示法似乎工作得很好。
$ViewTest = $ServerSmo.Databases["dbname"].Views.Item('foo', 'bar');
示例 4(Where-对象)
枚举 PowerShell 管道的所有 View
对象,然后使用Where-Object cmdlet 进行过滤似乎工作得很好,但效率低下且丑陋。
$ViewTest = $ServerSmo.Databases["dbname"].Views | Where-Object -FilterScript { $_.Name -eq 'foo' and $_.Schema -eq 'bar' };
所以写完所有这些之后,我想我的问题或多或少可以归结为:为什么索引器符号不能像示例#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"];
}
}
}
最佳答案
示例 #2 对我有用(在 v3 中),我可以使用以下命令更改 View TextBody:
$ViewTest = $ServerSmo.Databases['dbname'].Views['foo','bar']
$ViewTest.TextBody='foo'
$ViewTest.Alter()
在 v2 中 $ViewTest 是 System.Object[] 的集合,因此我必须对其进行索引以设置 bosy 并调用警报方法
$ViewTest = $ServerSmo.Databases['dbname'].Views['foo','bar']
$ViewTest[0].TextBody='foo'
$ViewTest[0].Alter()
关于sql-server - 为什么 SQL SMO 不返回我的 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9263165/