2016-09-21 80 views
0

我目前面臨一種奇怪的情況。T-SQL替換函數問題

我正在將一個查詢中的現有存儲過程的代碼收集到TMP表中。

表:

##SPListAndCode 
(
    Code nVarchar(MAX) 
) 

查詢:

INSERT INTO ##SPListAndCode 
    SELECT OBJECT_DEFINITION (OBJECT_ID('SPname'))) 

我試圖取代值從創建查詢來獲取之後,修改查詢

REPLACE(CODE, 'CREATE PROCEDURE', 'ALTER PROCEDURE') 

但問題是這樣的: REPLACE函數不會替換值。

但是,當我試圖使用

REPLACE(CODE, 'CREATE', 'ALTER') 

功能按預期工作。

但這種情況下是不適合我接受,因爲在存儲過程中可以有東西像裏面的「代碼」列

CREATE TABLE 

示例數據:

/****** Object: StoredProcedure dbo.spName Script Date: 6/20/2016 9:10:18 PM ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE PROCEDURE dbo.spName 
AS 
DECLARE @pStartDate date, @x int 


SET @pStartDate = (SELECT max(CT_ACTIVITY_DATE) FROM Table) 

... 

感謝很多提前任何形式的支持!

+0

你是如何填充'## SPListAndCode' – Tanner

+0

'REPLACE'應該已經做到了。但要調試更多,請向我們展示代碼 - 1.您在哪裏填充## SPListAndCode,2.您的查詢是否爲REPLACE'字符串/關鍵字 – Abhishek

+0

@Tanner 添加了用於填充## SPListAndCode的代碼。 –

回答

1

您的存儲過程在CREATE和PROCEDURE之間有兩個空格,而您的替換正在查找單詞之間具有單個空格的字符串。

+0

感謝MATE!這是個問題 雙重空間 –

0

要訪問包含的存儲過程中的實際代碼,你可以使用這樣的事情:

SELECT 
    so.name [ObjectName], so.type, 
    OBJECT_NAME(sc.id), sc.id, sc.colid , sc.[text] 
FROM 
    sys.syscomments sc 
INNER JOIN 
    sys.sysobjects so ON so.id = sc.id 
WHERE 
    so.type = 'P' 
ORDER BY 
    sc.id, sc.colid 

注意,可以爲每個對象的多個條目,並且colid被用於排序的條目。

+0

或者你可以使用'sys.procedures'目錄視圖(而不是'sys.sysobjects'),然後你不需要'WHERE so.type ='P''子句...... –

+0

好點marc_s。 – LogicalMan