为数据库中所有表增加PK2013-12-28辛辛苦苦将数据导入到数据库中,却发现忘记创建脚本中忘记PK了。好在表都有规律,每个表有个 [ID] int字段,PK是建立在其上的。注:1)为了代码的可读性,没有采用‘SQL拼接’方法, 而是采用了‘先占位,后替换’的方法--看里面的Replace语句。推荐给大家2)由于是执行DDL,出于 谨慎考虑,‘生成’而非‘直接执行’SQL。若不然,读者可以将里面的EXEC语句去掉注释。----这是 代码---------------------------------------
SET ANSI_NULLS ONGO SET QUOTED_IDENTIFIER ONGO-- ============================================= -- Author:Yew -- Create date: 2011-06-12 -- Description: 为所有表增加PK (on ID)/* ---------History-------------------------------------------------------------------------*/ -- ============================================= CREATE PROCEDURE [TOOL].[sp_DB_AddPK] ASBEGINSET NOCOUNT ON;DECLARE @vTable varchar(100) ,@vSchema varchar(100) ,@vSqlvarchar(max)DECLARE cur_ CURSOR FORSELECT [name], schema_name(schema_id) FROM sys.objects WHERE type in (N"U") ORDER BY schema_id, name OPEN cur_ FETCH NEXT FROM cur_INTO @vTable, @vSchema WHILE @@FETCH_STATUS = 0 BEGINSET @vSQL = N" ALTER TABLE [#Schema#].[#Table#] ADDCONSTRAINT [PK_#Table#] PRIMARY KEY CLUSTERED( [ID] ASC )WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = ON, ONLINE = OFF) ON [PRIMARY] GO"SET @vSQL = Replace(@vSQL, "#Table#", @vTable) SET @vSQL = Replace(@vSQL, "#Schema#", @vSchema) print @vSql --EXEC (@vSql)FETCH NEXT FROM cur_ INTO @vTable, @vSchema ENDCLOSE cur_ DEALLOCATE cur_ END