2017-01-03 6 views
2

Я хочу изменить строки в нескольких столбцах (например, все столбцы, содержащие строку «звук»), например, заменяя «,» на «.». В дополнение к this post, я понимаю, что мне нужно использовать динамический SQL. Я создал следующую процедуру:Изменение столбцов с использованием хранимой процедуры в SQL Server

USE [myDB] 
GO 

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[RemoveStringInColumn] (@colName varchar(50), @tableName varchar(50), @to_remove varchar(50), @to_add varchar(50)) 
AS 

DECLARE @sql nvarchar(4000) 
SET @sql = 'UPDATE ' + @tableName + ' SET ' + @colName + ' = REPLACE(' + @colName + ',' + @to_remove + ','+ @to_add + ');' 
PRINT @sql 
EXEC sp_executesql @sql 

которая вызывается:

EXEC dbo.RemoveStringInColumn 'COL_1', 'TABLE_1', ',', '.' 

1) Проблема является @sql команда не содержит мало дефис arond запятой и точки. Как я могу это решить?

2) В this post они используют команду SELECT для извлечения всех имен столбцов. До сих пор мне удалось получить имена столбцов, содержащие «звук».

select COLUMN_NAME AS my_cols 
from INFORMATION_SCHEMA.COLUMNS 
where table_name = 'TABLE_1' AND COLUMN_NAME LIKE '%sound%' 

Как я могу поместить имена столбцов в списке и использовать цикл, чтобы пройти через них вызывая RemoveStringInColumn процедуру?

Благодаря

ответ

3

Просто удваивать одинарные кавычки @to_remove и @to_add

DECLARE @sql NVARCHAR(4000) 

SET @sql = 'UPDATE ' + Quotename(@tableName) + ' SET ' + Quotename(@colName) 
      + ' = REPLACE(' + Quotename(@colName) + ',''' + @to_remove + ''',''' 
      + @to_add + ''');' 

PRINT @sql 

EXEC Sp_executesql 
    @sql 

Update:, чтобы сделать replace более одного столбца

DECLARE @sql  NVARCHAR(4000), 
     @col_list VARCHAR(8000)= '' 

SET @col_list = (SELECT ',' + Quotename(COLUMN_NAME) + ' = REPLACE(' 
         + Quotename(COLUMN_NAME) + ',''' + @to_remove 
         + ''',''' + @to_add + ''')' 
       FROM INFORMATION_SCHEMA.COLUMNS 
       WHERE table_name = 'TABLE_1' 
         AND COLUMN_NAME LIKE '%sound%' 
       FOR xml path('')) 
SET @col_list = Stuff(@col_list, 1, 1, '') 

SELECT @col_list 

SET @sql = 'UPDATE ' + Quotename(@tableName) + ' SET ' 
      + @col_list 

PRINT @sql 

EXEC Sp_executesql 
    @sql 
+0

Спасибо @ ППРР!. Это было очень глупо, но я не знал о двойных кавычках. Можно ли помещать столбцы в список, чтобы я мог их перебирать? – Nic

+0

@Nic - Вы хотите сделать то же самое 'replace' для более чем одного столбца? –

+0

точно. Я добавил несколько подробностей о моей текущей реализации. – Nic

Смежные вопросы