2016-09-21 45 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