无法生成脚本在SQL Server Management Studio中3次2008

问题描述:

我有一个奇怪的问题无法生成脚本在SQL Server Management Studio中3次2008

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

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

1)打开SQL Server 2008 Management Studio中 2)连接到服务器 3)右键单击选中的数据库,然后单击任务 - >生成脚本,然后选择数据库从列表中,单击下一步。 4)现在选择SP,视图和函数,然后点击Next, 5)它给出了我正在改变的三个选项的选项,即包含If不存在= true,脚本下拉= true,脚本使用数据库=假和拼接下一步按钮 5)点击Select All for All即将到来的屏幕 6)最后点击Finish按钮。

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

请让我知道如果我失去了一些东西,我尝试了很多方法。

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

如果我们将其重命名它工作得很好,例如早些时候被任命为dbo.SeperateElementsInt功能工作正常,但奇怪的是,生成脚本忽略了这个功能,以后我们把它改名为dbo.SeperateElementsInteger,并开始生成脚本。

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

查看这是给问题是dbo.DivisionInfo和dbo.CustomerDivisonOfficeInfo 存储过程,而被赋予的问题是dbo.procsync_get_zVariable

与2005年SSMS也存在问题。

感谢

+0

你能脚本他们通过视图对象资源管理器,并选择脚本查看右键点击? –

+0

是的,只有当我们“选择所有”视图时才会出现问题,如果您选择包括它们在内的10-15个视图,脚本将会生成 –

+0

不幸的是,我不知道除了打开轮廓仪并查看为什么SSMS看不到看法?有一次,它将不得不查询INFORMATION_SCHEMA或其他系统对象以获取视图列表。还有一件事:当您在生成脚本时选择全部时,检查这3个视图是否显示在列表中。 –

我们不了解对方INFORMATION_SCHEMA廓问题。我建议打开分析器,因为SSMS在INFORMATION_SCHEMA上做了一些SELECT语句和where子句。我怀疑查询本身会切断你的观点。一旦你有一个查询,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诠释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([email protected]_msparam_1 and SCHEMA_NAME(v.schema_id)[email protected]_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。如果Profiler日志中没有DivisionInfo,但您可以在向导中检查脚本,然后为DivisionInfo和脚本编写的一个视图采取脚本,并查看它们之间的差异。仔细查看它们之间的差异,以了解SMSS用于检索它们的脚本。

  • 出于某种原因SSMS丢弃该视图根据数据
  • 他查询提取(从探查逮住)

我只是碰到了确切的问题。我们试图编写一个数据库的模式(称为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%' 

这对我工作,我希望它为你。

保重,

汤姆