안녕하세요.
근간에 아래 stored procedure를 작성해서 잘 사용하고 있는데요.
문득.... 내가 왜 이렇게 replace하려고 하는 keyword들을 매번 콜하나 싶은 생각이 드는거에요.
@SearchStr에 delimeter를 넣어서 한번만 콜하구 그 안에서 다 처리하게 하면 좋지 않을까? 성능면이나 ...
군데... 딱 결론을 못 내겠습니다.
예를 들어 아래와 같이 5번 콜할것을
EXEC SearchAndReplace 'dbo.Endeca_Listings', 'CHAR(13)', ' ', 'Y'
EXEC SearchAndReplace 'dbo.Endeca_Listings', 'CHAR(10)', ' ', 'Y'
EXEC SearchAndReplace 'dbo.Endeca_Listings', '$', ' ', 'N'
EXEC SearchAndReplace 'dbo.Endeca_Listings', '|', ' ', 'N'
EXEC SearchAndReplace 'dbo.Endeca_Listings', '#', ' ', 'N'
아래와 같이 2번에 콜하는걸로 (delimeter는 ^)
EXEC SearchAndReplace 'dbo.Endeca_Listings', 'CHAR(13)^CHAR(10)', ' ', 'Y'
EXEC SearchAndReplace 'dbo.Endeca_Listings', '$^|^#', ' ', 'N'
로 하면 어떨까 하는 생각입니다.
현재 돌고 있는 stored procedure가 아래와 같은데요.
update을 많이 쓰면 성능면에서 많이 느려진다고 하니,
개념적으로 아래와 같이 바꿔주면 좋을까 싶거든요.
현재
update table set column = replace(column,'#','') where charindex('#',column)>0
update table set column = replace(column,'|','') where charindex('|',column)>0
update table set column = replace(column,'$','') where charindex('$',column)>0
-> update table set column = replace(replace(replace(column,'#','') ,'|','') , '$','') where charindex('#',column)>0 or charindex('|',column)>0 or charindex('$',column)>0
군데 이렇게 하려면 split써서 변수에 저장해야하고...
그래서 좀 복잡해지는 거두 같구. 변수 많이 쓰면 안좋을까 싶은생각도 들고...
암튼 어떤걸 주 포인트로 보고 고쳐야할지 고민이 많이 되서요.
그럼. 조언 부탁드립니다.
----------------------------------------------------------------------------------------------------
CREATE PROC [dbo].[SearchAndReplace]
(
@TableName nvarchar(256),
@SearchStr nvarchar(100),
@ReplaceStr nvarchar(100),
@fAscii char(1)
)
AS
BEGIN
SET NOCOUNT ON
DECLARE @ColumnName nvarchar(128), @SearchStr2 nvarchar(110), @SQL nvarchar(4000), @RCTR int
SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''')
SET @RCTR = 0
IF @TableName IS NOT NULL
BEGIN
SET @ColumnName = ''
WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL)
BEGIN
SET @ColumnName =
(
SELECT MIN(QUOTENAME(COLUMN_NAME))
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA= PARSENAME(@TableName, 2)
AND TABLE_NAME = PARSENAME(@TableName, 1)
AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar')
AND QUOTENAME(COLUMN_NAME) > @ColumnName
)
IF @ColumnName IS NOT NULL
BEGIN
IF @fAscii = 'Y'
BEGIN
SET @SQL= 'UPDATE ' + @TableName + ' SET ' + @ColumnName
+ ' = REPLACE(' + @ColumnName + ', ' + @SearchStr + ', ' + QUOTENAME(@ReplaceStr, '''') +
') WHERE CHARINDEX(' + @SearchStr + ', ' + @ColumnName + ')>0'
END
ELSE
BEGIN
SET @SQL= 'UPDATE ' + @TableName + ' SET ' + @ColumnName
+ ' = REPLACE(' + @ColumnName + ', ' + QUOTENAME(@SearchStr, '''') + ', ' + QUOTENAME(@ReplaceStr, '''') +
') WHERE ' + @ColumnName + ' LIKE ' + @SearchStr2
END
EXEC (@SQL)
SET @RCTR = @RCTR + @@ROWCOUNT
END
END
END
SELECT 'Replaced ' + CAST(@RCTR AS varchar) + ' occurence(s)' AS 'Outcome'
END
----------------------------------------------------------------------------------------------------
|