【问题标题】:Unable to Generate Script for 3 Views in SQL server management studio 2008无法在 SQL Server Management Studio 2008 中为 3 个视图生成脚本
【发布时间】:2015-06-19 00:54:01
【问题描述】:

我有一个奇怪的问题

当我从 Sql Server 2008 创建对象脚本(删除和创建存储过程、视图、函数的脚本)时,它错过了 3 个不知道为什么的视图?

我正在执行以下步骤来创建对象脚本

1) 打开 Sql Server 2008 Management Studio 2) 连接到服务器 3) 右键单击​​选定的数据库,然后单击任务-> 生成脚本,然后从列表中选择数据库,单击下一步。 4) 它提供了选项 我正在更改三个选项,即 Include If Not Exists = true、Script Drop = true、Script Use Database = false 和 clicing Next 按钮 4) 现在选择 SP, Views and Functions 并点击 Next, 5)点击全选为所有即将到来的屏幕 6) 最后点击完成按钮。

是否有任何限制或特殊条件或约定我未遵循并导致视图未包含在生成脚本中?

如果我遗漏了什么,请告诉我,我已经尝试了很多方法。

我还发现这个问题不仅存在于视图中,也存在于函数和存储过程中。

如果我们重命名它们,它就可以正常工作,例如之前名为 dbo.SeperateElementsInt 的函数可以正常工作,但奇怪的是,生成脚本忽略了这个函数,后来我们将它重命名为 dbo.SeperateElementsInteger 并开始生成脚本。

我们无法更改视图名称,因为它在许多地方使用。

出现问题的视图是 dbo.DivisionInfo 和 dbo.CustomerDivisonOfficeInfo 出现问题的存储过程是 dbo.procsync_get_zVariable

SSMS 2005 也存在问题。

谢谢

【问题讨论】:

  • 您可以通过右键单击对象资源管理器中的视图并选择脚本视图为来编写脚本吗?
  • 是的,只有当我们“全选”视图时才会出现问题,如果您选择包括它们在内的 10-15 个视图,则会生成脚本
  • 不幸的是,除了打开分析器并查看为什么 SSMS 看不到这些视图之外,我没有其他想法?在某一时刻,它必须查询 INFORMATION_SCHEMA 或其他一些系统对象来获取视图列表。还有一件事:当您在生成脚本时选择全部时,检查这 3 个视图是否显示在列表中。
  • 视图信息在 INFORMATION_SCHEMA 中可用,当我在生成脚本时选择全部时,这些视图也在列表中可用。
  • 我还发现这个问题不仅存在于视图中,也存在于函数和存储过程中。如果我们重命名它们就可以正常工作,例如之前名为 dbo.SeperateElementsInt 的函数工作正常,但奇怪的是,生成脚本忽略了这个函数,后来我们将它重命名为 dbo.SeperateElementsInteger 并开始生成脚本。我们无法更改视图名称,因为它在许多地方使用。出现问题的视图是 dbo.DivisionInfo 和 dbo.CustomerDivisonOfficeInfo StoredProcedure 出现问题的是 dbo.procsync_get_zVariable

标签: stored-procedures ssms sql-server-2008


【解决方案1】:

在 INFORMATION_SCHEMA-profiler 问题上,我们彼此不理解。我建议打开探查器,因为 SSMS 在 INFORMATION_SCHEMA 上使用一些 where 子句执行 SELECT。我怀疑查询本身会切断您的观点。一旦你有一个 SSMS 执行的查询来获取对象列表你应该找到为什么它没有看到一些视图。

以下是当您选择所有视图并开始编写脚本时 SSMS 执行的脚本。检查其中是否有任何一个不返回 DivisionInfo 视图。 (我在我的数据库中创建了 DivisionInfo 视图来重现您的案例)。为了快速检查,一个一个地执行它们,并在每次查询后阅读我的 cmets。 请注意,您实际上应该使用 Profiler 在您的环境中捕获查询,因为它们可能在您的环境中有所不同。

在显示屏幕以选择视图、程序、... SSMS 执行以下脚本以获取视图列表:

exec sp_executesql N'SELECT
''Server[@Name='' + quotename(CAST(
        serverproperty(N''Servername'')
       AS sysname),'''''''') + '']'' + ''/Database[@Name='' + quotename(db_name(),'''''''') + '']'' + ''/View[@Name='' + quotename(v.name,'''''''') + '' and @Schema='' + quotename(SCHEMA_NAME(v.schema_id),'''''''') + '']'' AS [Urn],
v.name AS [Name],
SCHEMA_NAME(v.schema_id) AS [Schema]
FROM
sys.all_views AS v
WHERE
(v.type = @_msparam_0)and(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)=0)
ORDER BY
[Schema] ASC,[Name] ASC',N'@_msparam_0 nvarchar(4000)',@_msparam_0=N'V'

您的观点是否列出?您可以添加条件WHERE v.name = 'DivisionInfo' 对其进行过滤。如果没有列出 DivisionInfo,请检查该查询的哪一部分将其从结果集中消除。

一旦您选择要编写脚本的对象并开始编写脚本,SSMS 就会创建临时表,将对象存储在其中并执行脚本以查找相关对象。

创建临时表并在其中插入 DivisionInfo 视图:

CREATE TABLE #tempdep (objid int NOT NULL, objname sysname NOT NULL, objschema sysname NULL, objdb sysname NOT NULL, objtype smallint NOT NULL)

exec sp_executesql N'INSERT INTO #tempdep 

SELECT
v.object_id AS [ID],
v.name AS [Name],
SCHEMA_NAME(v.schema_id) AS [Schema],
db_name(),
2
FROM
sys.all_views AS v
WHERE
(v.type = @_msparam_0)and(v.name=@_msparam_1 and SCHEMA_NAME(v.schema_id)=@_msparam_2)',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000)',@_msparam_0=N'V',@_msparam_1=N'DivisionInfo',@_msparam_2=N'dbo'

此查询是否在#tempdep 中插入了任何内容?如果不是,请检查原因。 再一次,您必须使用 Profiler 从您的环境中获取查询,而不是使用我放在这里的查询,因为它们来自我的环境。

当您开始分析时,应该有许多类似上面的插入。您需要找到与 DivisionInfo 相关的那个。您可以使用 Find 选项来查找它,因为您将在 Profiler 中看到许多查询,因为您有很多其他视图。为了使分析器日志更小,仅脚本视图。

如您所见,想法是开始分析并开始编写脚本。脚本编写完成后,停止分析器并检查 SSMS 执行的脚本。您应该找到为什么它没有看到 DivisionInfo。如果探查器日志中没有 DivisionInfo,但您可以在向导中检查它的脚本,然后为 DivisionInfo 和脚本工作的一个视图获取脚本,并查看它们之间的差异。仔细看看它们之间在 SMSS 用于检索它们的脚本方面的差异。

  • 出于某种原因,SSMS 放弃了此视图
  • 根据他通过查询提取的数据(从分析器捕获)

【讨论】:

    【解决方案2】:

    我刚刚遇到了确切的问题。我们试图编写一个数据库的架构(称为 Database_A),但许多视图都不会编写脚本。

    我们停用了另一个数据库(称为 Database_B),并且所有不会编写脚本的视图(在 Database_A 中)都指向该数据库 (Database_B) - 通过链接服务器访问该数据库并且处于脱机状态。由于所有的连接字符串现在都指向 Database_A 现在所在的新服务器,因此我将旧服务器上的 Database_A 以 read_only 的形式联机了足够长的时间来编写视图脚本,并且它起作用了。使数据库再次脱机,我们得到了我们需要的东西。

    我在视图中查找链接服务器引用的脚本是这样的:

        use Database_B
        go
    
        select so.name, sc.text 
        from sysobjects so, syscomments sc
        where so.id = sc.id
        and sc.text like '%Database_A%'
    

    这对我有用,我希望它也对你有用。

    保重,

    汤姆

    【讨论】:

      猜你喜欢
      • 2014-02-18
      • 2012-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多