2013-10-04 142 views
0

我創建了一個帶有3個參數的存儲過程。我對第二個參數有問題([HQ-211-STOCK-DBO])。我一直在試圖找出相當長的一段時間。存儲過程參數導致錯誤

這裏是調用SP:

EXEC [dbo].[spColumnsChanged] '[HQ-193-STOCK-DBO]','[HQ-211-STOCK-DBO]','arch_conv_col_diffs' 

在SP我有以下代碼:

CREATE PROCEDURE [dbo].[spColumnsChanged] (@sr_database nvarchar(128),@tr_database nvarchar(128),@diff_table nvarchar(128)) 

...

SET @DFCursor = CURSOR FAST_FORWARD FOR 
SELECT o.name table_name, col.name column_name, t.name data_type, col.max_length, col.is_nullable 
FROM @tr_database.sys.columns col 
INNER JOIN @tr_database.dbo.sysobjects o on o.id = col.object_id 
INNER JOIN @tr_database.sys.types t ON t.user_type_id = col.user_type_id 
WHERE o.xtype = 'U' -- user tables 
ORDER BY o.name, col.column_id 

當我運行的SP我收到錯誤: 「(Msg 102,Line 63)'。'附近的語法錯誤。」

第63行是FROM語句,它使用SP的第三個參數。 (@tr_database)

有趣的是,如果我substitue實際參數值,像這樣的參數:

SELECT o.name table_name, col.name column_name, t.name data_type, col.max_length, col.is_nullable 
    FROM [HQ-211-STOCK-DBO].sys.columns col 
    INNER JOIN [HQ-211-STOCK-DBO].dbo.sysobjects o on o.id = col.object_id 
    INNER JOIN [HQ-211-STOCK-DBO].sys.types t ON t.user_type_id = col.user_type_id 
    WHERE o.xtype = 'U' -- user tables 
    ORDER BY o.name, col.column_id 

它工作正常。

任何人都可以發現錯誤?

+0

哪一行是63 – AhmetEmre90

+1

您不能像這樣使用數據庫名稱的參數:'@ tr_database.sys.types'。您需要使用EXEC並從該參數構建一個字符串。見[這個答案](http://stackoverflow.com/questions/2073544/set-database-name-dynamically-in-sql-server-stored-procedure) – CodingIntrigue

回答

3

你需要的是dynamic sql

不能設置作爲表/視圖/函數或其他數據庫對象的名稱的參數。你需要什麼沿着這些路線是:

declare @sql nvarchar(max) 
SET @SQL = 'SET @DFCursor = CURSOR FAST_FORWARD FOR 
      SELECT o.name table_name, col.name column_name, t.name data_type, 
        col.max_length, col.is_nullable 
      FROM '[email protected]_database+'.sys.columns col 
      INNER JOIN '[email protected]_databasee+'.dbo.sysobjects o 
        ON o.id = col.object_id 
      INNER JOIN '[email protected]_databasee+'.sys.types t 
        ON t.user_type_id = col.user_type_id 
      WHERE o.xtype = ''U'' 
      ORDER BY o.name, col.column_id' 
EXECUTE(@SQL) 

恕我直言,使用動態SQL遊標混合將是噩夢般的,無論是從維護和性能的角度來看,但是,對於一個一次性的一段代碼,它可能工作。