我想从SQL Server(2008)中的数据库中获取所有索引,键和外键的详细信息。我该怎么做?
我计划使用它来在几个有点类似的数据库中同步这些属性。
我可以使用SQL Server Management Studio,但由于网络托管服务商设置的限制,我无法对数据库进行完整备份。
-
您不需要回答的次要问题:
为什么不能在Mysql中出现类似于数据库模式的东西,它只是以文本SQL脚本格式列出所有数据库结构?
答案 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会产生此错误。
我希望这有帮助!