Sql 如何获得具有正确名称的视图的定义?

Sql 如何获得具有正确名称的视图的定义?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个数据库,其中有几个视图在过去被用户手动重命名 如果我试图获取视图的定义,以便在其他地方编写其创建脚本。我可以使用以下方法获得后台名称“错误”的数据库列表: 选择对象名称(对象id)、定义 从sys.sql\u模块 其中convert(nvarchar(200),definition)不象(“%”+对象名称(对象id)+“%”) 有没有办法获得视图的正确定义,因为它将生成具有新名称的视图?或者,是否有一种方法可以提取视图的幕后名称,以便在使用它之前用定义中的正确名称替换它 真正令人恼

我有一个数据库,其中有几个视图在过去被用户手动重命名

如果我试图获取视图的定义,以便在其他地方编写其创建脚本。我可以使用以下方法获得后台名称“错误”的数据库列表:

选择对象名称(对象id)、定义
从sys.sql\u模块
其中convert(nvarchar(200),definition)不象(“%”+对象名称(对象id)+“%”)

有没有办法获得视图的正确定义,因为它将生成具有新名称的视图?或者,是否有一种方法可以提取视图的幕后名称,以便在使用它之前用定义中的正确名称替换它


真正令人恼火的是,如果我使用GUI“脚本视图为>创建到>新建查询编辑器窗口”,它会生成正确的创建脚本,因此SSMS显然有一些方法可以访问此信息:

有没有办法获得视图的正确定义,因为它将生成具有新名称的视图

对。使用(在代码或PowerShell中)或SSMS(使用SMO)为视图编写脚本。SMO是适用于所有SQL Server对象的完全逼真的脚本引擎

使用Powershell,您可以轻松实现自动化,例如:

$sql = Get-SqlInstance -ServerInstance "localhost"
$db = $sql | get-sqldatabase -Name "AdventureWorks2017"
foreach ($v in $db.Views)
{
   [Microsoft.SqlServer.Management.Smo.View] $vv = $v
   write-host $vv.Script()
}
从分析器来看,这里没有服务器端功能。SMO获取视图定义,并具有TSQL解析器,因此它可以在编写对象脚本时修复DDL。以下是SMO运行以获取视图主体的查询:

SELECT
CAST(
        serverproperty(N''Servername'')
       AS sysname) AS [Server_Name],
db_name() AS [Database_Name],
SCHEMA_NAME(v.schema_id) AS [Schema],
v.name AS [Name],
CAST(ISNULL(OBJECTPROPERTYEX(v.object_id,N''ExecIsQuotedIdentOn''),0) AS bit) AS [QuotedIdentifierStatus],
CAST(
 case 
    when v.is_ms_shipped = 1 then 1
    when (
        select 
            major_id 
        from 
            sys.extended_properties 
        where 
            major_id = v.object_id and 
            minor_id = 0 and 
            class = 1 and 
            name = N''microsoft_database_tools_support'') 
        is not null then 1
    else 0
end          
             AS bit) AS [IsSystemObject],
CAST(ISNULL(OBJECTPROPERTYEX(v.object_id,N''ExecIsAnsiNullsOn''),0) AS bit) AS [AnsiNullsStatus],
v.object_id AS [ID],
NULL AS [Text],
ISNULL(smv.definition, ssmv.definition) AS [Definition]
FROM
sys.all_views AS v
LEFT OUTER JOIN sys.sql_modules AS smv ON smv.object_id = v.object_id
LEFT OUTER JOIN sys.system_sql_modules AS ssmv ON ssmv.object_id = v.object_id
WHERE
(v.type = @_msparam_0)and(v.name=@_msparam_1 and SCHEMA_NAME(v.schema_id)=@_msparam_2)
ORDER BY
[Database_Name] ASC,[Schema] ASC,[Name] ASC',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000)

尝试删除视图并重新创建它们。我认为这是重命名的一个错误。你能详细说明一下如何在程序上做到这一点吗?这意味着我的目标是实现自动化,而不是使用GUI手动执行步骤。