无法在SQL Server Management Studio 2008中为3个视图生成脚本

时间:2011-11-23 12:59:34

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

我有一个奇怪的问题

当我从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,视图和功能,然后单击下一步, 5)单击为所有即将到来的屏幕选择全部 6)最后点击Finish按钮。

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

如果我错过了什么,请告诉我,我尝试了很多方法。

我还发现这个问题不仅存在于Views中,而且还存在函数和存储过程。

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

我们无法更改在许多地方使用的视图名称。

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

SSMS 2005也存在问题。

由于

2 个答案:

答案 0 :(得分:0)

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

以下是SSMS在您选择所有视图并开始编写脚本时执行的脚本。检查它们中是否有任何不返回DivisionInfo视图。 (我在我的数据库中创建了DivisionInfo视图来重现你的情况)。为了快速检查,逐个执行它们并在每次查询后阅读我的注释。 请注意,您应该使用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相关的那个。您可以使用“查找”选项来查找它,因为您将在Profiler中看到许多查询,因为您有很多其他视图。要使分析器日志更小,请仅编写脚本视图。

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

  • 由于某种原因SSMS丢弃此视图
  • 根据他用查询提取的数据(从分析器中获取)

答案 1 :(得分:0)

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

我们退出了另一个数据库(称之为Database_B),并且所有不会编写脚本(在Database_A中)指向该数据库(Database_B)的视图 - 这是通过链接服务器访问的,并且是离线。由于所有连接字符串现在都指向Database_A现在所在的新服务器,因此我将read_only上的旧服务器上的Database_A带到了脚本以便编写视图,这很有效。再次使数据库脱机,我们得到了我们需要的东西。

我在一起找到视图中链接服务器引用的脚本是:

    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%'

那对我有用的东西,我希望它也适合你。

小心,

汤姆