如何编写SQL Server中的索引,键,外键脚本

时间:2010-12-28 08:35:21

标签: sql-server indexing foreign-keys key

我想从SQL Server(2008)中的数据库中获取所有索引,键和外键的详细信息。我该怎么做?

我计划使用它来在几个有点类似的数据库中同步这些属性。

我可以使用SQL Server Management Studio,但由于网络托管服务商设置的限制,我无法对数据库进行完整备份。

-

您不需要回答的次要问题:

为什么不能在Mysql中出现类似于数据库模式的东西,它只是以文本SQL脚本格式列出所有数据库结构?

6 个答案:

答案 0 :(得分:6)

假设您使用的是至少SQL Server 2005或更高版本,则可以使用Database Publishing Wizard编写架构脚本

这可用于为仅架构,数据或两者生成脚本。

它直接集成到Visual Studio 2005和/或Visual Web Developer 2005

如果您使用的是VS2008,则会预安装v1.2版本的SQL发布向导。您可以查看here从哪里调用它。

答案 1 :(得分:5)

如果您正在寻找详细的,更具体的脚本对象,您也可以使用相应数据库Task > Generate Scripts选项中的生成脚本。

检查 http://www.kodyaz.com/articles/sql-server-script-data-with-generate-script-wizard.aspx 详情。

答案 2 :(得分:2)

答案 3 :(得分:2)

如果你需要从T-SQL获取脚本,那么只使用xp_cmdshell。 例如,使用SMO和powershell编写concreate视图的脚本concreate索引(结果在@script变量中,您可以使用sp_executesql执行它):

DECLARE @OUTPUT TABLE (line nvarchar(max))
DECLARE @cmd VARCHAR(8000), @ps VARCHAR(8000), @psLoadAssemblies VARCHAR(8000), @script nvarchar(max) =''
DECLARE @srv nvarchar(max)='<server name>', 
        @ln nvarchar(max)='<login>', 
        @pw nvarchar(max)='<password>', 
        @db nvarchar(max) = '<database>', 
        @schemaName nvarchar(max) = '<schema>',  -- without '[' ']'
        @viewName nvarchar(max) = '<view name>',  -- without '[' ']'
        @indexName nvarchar(max) = '<index name>' -- without '[' ']'

SET @psLoadAssemblies  = '[System.Reflection.Assembly]::LoadWithPartialName(''Microsoft.SqlServer.SMO'')|Out-Null;'
SET @ps='$using=''Microsoft.SqlServer.Management.Smo'';$s=new-object($using+''.Server'') $srv;$c = $s.ConnectionContext;$c.LoginSecure=$false;$c.Login=$ln;$c.Password=$pw; Write-Host ($s.Databases[$db].Views.Item($viewName,$schemaName).Indexes[$indexName].Script())'
SET @ps=REPLACE(@ps,'$srv',''''+@srv+'''')
SET @ps=REPLACE(@ps,'$ln',''''+@ln+'''')
SET @ps=REPLACE(@ps,'$pw',''''+@pw+'''')
SET @ps=REPLACE(@ps,'$db',''''+@db+'''')

SET @ps=REPLACE(@ps,'$schemaName',''''+@schemaName+'''')
SET @ps=REPLACE(@ps,'$viewName',''''+@viewName+'''')
SET @ps=REPLACE(@ps,'$indexName',''''+@indexName+'''')

SET @cmd = 'powershell -Command "'+@psLoadAssemblies+@ps+'"'
exec dev.Msg @cmd
INSERT INTO @OUTPUT
exec xp_cmdshell @cmd

SELECT @script+line FROM @OUTPUT
WHERE line is not null

PRINT @script

P.S。对于那些问我们为什么需要这些技巧的人:在某些情况下,例如: “使用第三方工具导入数据”,“drop-recreate”方法比“enable-disable”对象更好地工作,例如因为这样的第三方工具可以调用“truncate”,如果你的表参与模式绑定视图,你将得到第三方工具错误(截断表参与索引视图会引发错误,因此我们被迫删除所有索引的视图在导入之前并在之后重新创建它。

答案 4 :(得分:1)

作为InSane完美答案的替代方案,您可以右键单击SSMS中的任何对象,将其编写为文本文件或窗口。
一些免费和非免费产品也允许您这样做,包括WinSQL

答案 5 :(得分:0)

我看过用户“dontomoso”的评论或回复。在翻译成英文之后,似乎“操作无效,因为对象的当前状态。(SqlPubWiz)”在“数据库发布向导”中是经历的错误。

经过这么多实验和试验,在这个应用程序中。数据库名称区分大小写。为-d参数添加正确的大小写值。解决方案很简单,更改默认架构名称或初始目录名称与“在创建DB时使用”相同。例如。在创建使用playGround的同时,也可以在这里使用playGround ... Playground或playground或PlayGround会产生此错误。

我希望这有帮助!