T-SQL替换功能问题

时间:2016-09-21 12:48:37

标签: sql-server replace

我目前面临一种奇怪的情况。

我正在从查询中收集现有存储过程的代码到TMP表。

表:

##SPListAndCode
(
    Code nVarchar(MAX)
)

查询:

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

之后我尝试将值替换为Create query,Alter query

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

但问题是:REPLACE函数没有替换值。

但是,当我尝试使用

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

功能按预期工作。

但这种情况对我来说是不可接受的,因为在存储过程中可能存在类似

的内容
CREATE TABLE

内部示例数据" Code"柱:

/****** 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)

...

非常感谢您提供任何支持!

2 个答案:

答案 0 :(得分:1)

您的存储过程在CREATE和PROCEDURE之间有两个空格,而您的替换是查找字符之间有一个空格的字符串。

答案 1 :(得分: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用于对这些条目进行排序。