重新整理SP到一資料庫方便製作XSD檔案

來源:互聯網
上載者:User
資料|資料庫|重新整理
----------------------------------------------------------------------------------
--        重新整理SP到資料庫         --
--                    --
-- &Old& 來來源資料庫名               --
-- &New& 目標資料庫名               --
--                    --
-- 目標資料庫中表名為來來源資料庫中的使用者自訂SP、FN等(可按提示添加--詳細提示以後加) --
--    表中的列名則為其參數            --
--                    --
-- 黃宗銀                  --
-- 2005.01.19                 --
----------------------------------------------------------------------------------
ALTER PROCEDURE dbo.P_Ref
AS
 DECLARE @SQL nvarchar(4000)

 -- 不存在資料庫則建立
 IF NOT EXISTS (
  SELECT [name]
  FROM master.dbo.sysdatabases
  WHERE [name] = '&New&'
  )
 BEGIN
  CREATE DATABASE &New&
 END

 -- 取出SP、FN、TF其name、id
 DECLARE @Tbl CURSOR
 SET  @Tbl = CURSOR LOCAL SCROLL FOR
 SELECT [name], [id]
 FROM &Old&.dbo.sysobjects
  -- 要增加重新整理類型請修改這裡
 WHERE ([name] LIKE 'P%' OR [name] LIKE 'F%' OR [name] LIKE 'TF%')
  AND (type = 'P' OR type = 'FN' OR type = 'TF' )

 DECLARE @TblName nvarchar(100)
 DECLARE @TblID  int

 -- 以@TblName為名建立表
 OPEN @Tbl
 FETCH NEXT FROM @Tbl INTO @TblName, @TblID
 WHILE( @@FETCH_STATUS = 0 )
 BEGIN
  -- 已存在該表則刪除
  IF EXISTS
   (
    SELECT [name] FROM &New&.dbo.sysobjects
    WHERE [name] = @TblName
     AND type = 'U'
   )
  BEGIN
   SET @SQL = 'DROP TABLE ' + '&New&' + '.dbo.' + @TblName
   EXEC SP_ExecuteSQL @SQL
   IF( @@ERROR <> 0 )
   BEGIN
    RAISERROR( '刪除已存在的表%s失敗!', 11, 1, @TblName )
    RETURN
   END
  END

  -- 如果沒有參數則跳過
  IF( (SELECT Count(*) FROM dbo.syscolumns WHERE [name] LIKE '@%' AND [id] = @TblID) = 0 )
  BEGIN
   FETCH NEXT FROM @Tbl INTO @TblName, @TblID
   CONTINUE
  END

  -- 取出列名及其類型
  DECLARE @Col CURSOR
  SET  @Col = CURSOR LOCAL SCROLL FOR
  SELECT &Old&.dbo.syscolumns.[name], &Old&.dbo.systypes.[name]
  FROM &Old&.dbo.syscolumns LEFT OUTER JOIN
    &Old&.dbo.systypes ON &Old&.dbo.syscolumns.xtype = &Old&.dbo.systypes.xtype
  WHERE &Old&.dbo.syscolumns.[name] LIKE '@%'
   AND &Old&.dbo.syscolumns.[id] = @TblID
  ORDER BY &Old&.dbo.syscolumns.colorder

  DECLARE @ColName nvarchar(50)
  DECLARE @ColType nvarchar(20)

  -- 構造SQL語句
  SET @SQL = 'CREATE TABLE &New&.dbo.' + @TblName + '('
  OPEN @Col
  FETCH NEXT FROM @Col INTO @ColName, @ColType
  DECLARE @ColNameLast nvarchar(50)
  SET  @ColNameLast = ''
  WHILE( @@FETCH_STATUS = 0 )
  BEGIN
   SET @ColName = SubString( @ColName, 2, Len( @ColName )-1 )
   -- 跳過重複的列
   IF( @ColName <> @ColNameLast )
   BEGIN
    SET @SQL = @SQL + @ColName + ' ' + @ColType + ','
    SET @ColNameLast = @ColName
   END
   FETCH NEXT FROM @Col INTO @ColName, @ColType
  END
  SET @SQL = SubString( @SQL, 1, Len( @SQL )-1 )
  SET @SQL = @SQL + ')'

  -- 執行SQL語句
  EXEC SP_ExecuteSQL @SQL
  IF( @@ERROR <> 0 )
  BEGIN
   RAISERROR( '建立表%s失敗!', 11, 1, @TblName )
   RETURN
  END

  -- 建立下一個表
  FETCH NEXT FROM @Tbl INTO @TblName, @TblID
 END

RETURN @@ERROR


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。