none
copy store procedure失敗 RRS feed

  • 問題

  • 使用sqlexpress 2008 / sql server(10.0.5500) management studio

    從他資料庫copy預存程序碼(已可執行成功的),到新資料庫(test):

    USE [test]
    GO

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[alm_table]
    @tname nvarchar(9)
    AS
    SET NOCOUNT ON

    exec('SELECT * INTO ' + @tname + ' FROM dbo.sample_alarm')

    exec('ALTER TABLE ' + @tname + ' ADD PRIMARY KEY (idx)') --加入PK--
    exec('ALTER TABLE ' + @tname + ' ADD CONSTRAINT ' + @tname + '_build DEFAULT ''-'' FOR build') --預設初值--
    exec('ALTER TABLE ' + @tname + ' ADD CONSTRAINT ' + @tname + '_place DEFAULT ''-'' FOR place')
    exec('ALTER TABLE ' + @tname + ' ADD CONSTRAINT ' + @tname + '_device DEFAULT ''-'' FOR device')
    exec('ALTER TABLE ' + @tname + ' ADD CONSTRAINT ' + @tname + '_events DEFAULT ''-'' FOR events')
    exec('ALTER TABLE ' + @tname + ' ADD CONSTRAINT ' + @tname + '_state DEFAULT ''-'' FOR state')

    RETURN

    執行產生:訊息 208,層級 16,狀態 6,程序 alm_table,行 18 無效的物件名稱 'dbo.alm_table'。

    無法建立此預存程序,請各位指教是哪裡出差錯.

    thank!

    • 已移動 AChange 2013年7月26日 上午 08:33
    2013年7月26日 上午 08:24

解答

  • 問題是一直無法儲存此程序,雖更改不存在的名稱亦無效.

    暫時解決方法:

    到微軟網站COPY 範例碼:"逐步解說:建立 Northwind Customers 資料表的預存程序".

    再修改回原名稱/原內容,竟然可儲存成功!

    WHY?

    • 已標示為解答 old tsai 2013年7月27日 上午 01:46
    2013年7月27日 上午 01:45

所有回覆

  • 您好, 已移動您的文章至正確版區, 請您下次依據產品類型選擇正確的版區. 謝謝您!

    請記得對您有幫助的回覆標註為"解答". 以幫助其他尋找解答及參與社群討論的朋友們.
    Please remember to click “Mark as Answer” on the post that helps you. This can be beneficial to other community members reading the thread.

    2013年7月26日 上午 08:34
  • 很明顯的錯誤

    看你的新資料庫(test)底下有沒有資料表:'dbo.alm_table'


    保證解答-微軟技術支援服務

    2013年7月26日 上午 09:44
    版主
  • You tried to alter non-existing stored procedure.
    2013年7月26日 下午 12:52
  • 問題是一直無法儲存此程序,雖更改不存在的名稱亦無效.

    暫時解決方法:

    到微軟網站COPY 範例碼:"逐步解說:建立 Northwind Customers 資料表的預存程序".

    再修改回原名稱/原內容,竟然可儲存成功!

    WHY?

    • 已標示為解答 old tsai 2013年7月27日 上午 01:46
    2013年7月27日 上午 01:45
  • 有沒有可能是你這個Stored Procedure是從其他資料庫複製過來的,因此Test資料中尚未存在alm_table這個Stored Procedure,而您所執行的ALTER PROC,是用來修改已經存在的Strored Procedure,當要修改的Stored Procedure不存在時,就可能發生您所看到的錯誤訊息。

    或許您可以試試看把上述指令碼的ALTER PROC改成CREATE PROC,應該就可以正常執行了。

    PS:您也可以在使用CREATE PROC前,可以先將之刪除再重新建立Stored Procedure,完整程式碼如下:

    USE [test]
     GO
    
     IF OBJECT_ID('alm_table') IS NOT NULL
    	DROP PROC [alm_table]
    GO
    
     SET ANSI_NULLS ON
     GO
     SET QUOTED_IDENTIFIER ON
     GO
     CREATE PROCEDURE [dbo].[alm_table]
     @tname nvarchar(9)
     AS
     SET NOCOUNT ON
    
    exec('SELECT * INTO ' + @tname + ' FROM dbo.sample_alarm') 
    
     exec('ALTER TABLE ' + @tname + ' ADD PRIMARY KEY (idx)') --加入PK--
    exec('ALTER TABLE ' + @tname + ' ADD CONSTRAINT ' + @tname + '_build DEFAULT ''-'' FOR build') --預設初值--
    exec('ALTER TABLE ' + @tname + ' ADD CONSTRAINT ' + @tname + '_place DEFAULT ''-'' FOR place')
     exec('ALTER TABLE ' + @tname + ' ADD CONSTRAINT ' + @tname + '_device DEFAULT ''-'' FOR device')
     exec('ALTER TABLE ' + @tname + ' ADD CONSTRAINT ' + @tname + '_events DEFAULT ''-'' FOR events')
     exec('ALTER TABLE ' + @tname + ' ADD CONSTRAINT ' + @tname + '_state DEFAULT ''-'' FOR state') 
    
    RETURN


    以上說明若有錯誤請指教,謝謝。

    | 台灣 SQL PASS 社群 | SQL PASS Taiwan

    | 歡迎參觀我的BLOG - 積沙成塔


    2013年7月28日 下午 02:11
    版主
  • 感謝各位的熱心解答,但最後一個的建議方式也試過,仍然無解.

    (推測可能需重新安裝軟體環境,因先前已同樣的建置過2次,是可以的.)

    2013年8月7日 上午 12:26