Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
Klesk666
Member

Откуда:
Сообщений: 14
база от 1с 7.7
надо убрать непечатные символы в поле descr (есть не у всех таблиц бд)
в sql не силен, поэтому прошу помощи.
Для одной таблицы понимаю что то типа того:
Update dbo.SC172 set DESCR = REPLACE (DESCR,char(1),'')
Update dbo.SC172 set DESCR = REPLACE (DESCR,char(2),'')
...
Update dbo.SC172 set DESCR = REPLACE (DESCR,char(31),'')


но как то долго, некрасиво и как сделать разом для всех таблиц?
заранее спасибо.
5 фев 12, 22:50    [12037402]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
step_ks
Member

Откуда:
Сообщений: 936
например, так
exec sp_msforeachtable 'if col_length(''?'',''DESCR'') is not null exec (''Update ? set DESCR = REPLACE (DESCR,char(1),'''''''')'')'
5 фев 12, 23:30    [12037585]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
Klesk666
Member

Откуда:
Сообщений: 14
а так можно? (все таблицы начинются с SC)

use PopTmp
DECLARE @i int
declare @n int
Declare @tablen varchar
SELECT @n
SELECT @n = 1 
while @n<9999 begin
SELECT @tablen=convert( varchar,@n)
	if object_id('dbo.SC' +@tablen,'U') is not NULL
		SELECT @i = 1
			WHILE @i < 31 begin
				if @i=9 
					exec('Update dbo.SC' + @tablen + ' set DESCR = REPLACE (DESCR,char(@i),chr(32))')
				else
					exec('Update dbo.SC' + @tablen + ' set DESCR = REPLACE (DESCR,char(@i),chr(0))')
			end
end


страшно запускать =)
5 фев 12, 23:35    [12037599]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
step_ks
Member

Откуда:
Сообщений: 936
Для одноразового скрипта как удобнее, так и делайте. Чтоб не страшно было запускать - поставьте print вместо exec и проверьте, что получается.
5 фев 12, 23:45    [12037632]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
Klesk666
Member

Откуда:
Сообщений: 14
пока вот что получается
DECLARE @i int
declare @n int
Declare @tablen varchar
SELECT @n = 1 
while @n<9999 begin

SELECT @tablen=convert( varchar,@n)
print @tablen

		SELECT @i = 1
			WHILE @i < 32 begin
				if @i=9 
					print('Update dbo.SC' + @tablen + ' set DESCR = REPLACE (DESCR,''' + char(@i) + ''','''+' '''+')')
						
				else

					print('Update dbo.SC' + @tablen + ' set DESCR = REPLACE (DESCR,''' + char(@i) + ''','''+''''+')')
				set @i=@i+1
			end

set @n=@n+1
end

не могу понять почему @tablen изменяется только от 1 до 9
6 фев 12, 00:42    [12037776]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
invm
Member

Откуда: Москва
Сообщений: 9826
Klesk666
не могу понять почему @tablen изменяется только от 1 до 9
Потому что
Declare @tablen varchar
эквивалентно
Declare @tablen varchar(1)
Размерность укажите.
6 фев 12, 01:05    [12037803]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
qwerty112
Guest
Klesk666
print('Update dbo.SC' + @tablen + ' set DESCR = REPLACE (DESCR,''' + char(@i) + ''','''+''''+')')

print('Update dbo.SC' + @tablen + ' set DESCR = REPLACE (DESCR,char(' + str(@i) + '),'''+''''+')')
6 фев 12, 01:08    [12037806]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
Klesk666
Member

Откуда:
Сообщений: 14
Окончательный вроде бы вариант

declare @i int
declare @n int
declare @st varchar(255)
declare @tablen varchar(4)
SELECT @n = 1 
while @n<9999 begin
	SELECT @tablen=ltrim(convert( varchar,@n))
	SELECT @i = 1
	WHILE @i < 32 begin
		if @i=9 
			set @st=ltrim('Update dbo.SC' + @tablen + ' set DESCR = REPLACE (DESCR,''' + char(@i) + ''','''+' '''+')')
		else 
			set @st=ltrim('Update dbo.SC' + @tablen + ' set DESCR = REPLACE (DESCR,''' + char(@i) + ''','''+''''+')')
		if object_id('dbo.SC' +@tablen,'U') is not NULL begin
			print @st
			exec(@st)
		end
		set @i=@i+1
	end
set @n=@n+1
end

за 10 минут отработала, всем спасибо!
6 фев 12, 01:27    [12037835]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
Klesk666
Member

Откуда:
Сообщений: 14
а как по всем полям пройтись? )
6 фев 12, 01:32    [12037843]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
aleks2
Guest
step_ks
Чтоб не страшно было запускать - поставьте print вместо exec и проверьте, что получается.

Чтобы савсем НЕ страшно: 1) бэкап; 2) запускать в открытой транзакции, проверить результат и тады уж commit али rollback.

А "print вместо exec" это слабо спасает.
6 фев 12, 06:17    [12037955]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
Klesk666
Member

Откуда:
Сообщений: 14
Покритикуйте

declare @i int
declare @st varchar(1000)
declare @tname varchar(200)
declare @cname varchar(200)
DROP TABLE #tmp1
CREATE TABLE #tmp1(TABLE_NAME varchar(200),COLUMN_NAME varchar(200))
INSERT INTO #tmp1
select TABLE_NAME,COLUMN_NAME FROM information_schema.columns where DATA_TYPE='char'
DECLARE @cursor1 CURSOR 

SET @cursor1 = CURSOR  
FOR SELECT TABLE_NAME,COLUMN_NAME from #tmp1
OPEN @CURSOR1
FETCH NEXT FROM @CURSOR1 INTO @tname,@cname

WHILE @@FETCH_STATUS = 0

BEGIN
	print left(@cname,2)
	if @cname='DESCR' or left(@cname,2)='SP' 
	BEGIN
		SELECT @i = 1

		WHILE @i < 32 
			begin
				if @i=9 
					set @st=ltrim('Update dbo.' + @tname + ' set '+@cname+' = REPLACE ('+@cname+',''' + char(@i) + ''','''+' '''+')')
				else 
					set @st=ltrim('Update dbo.' + @tname + ' set '+@cname+' = REPLACE ('+@cname+',''' + char(@i) + ''','''+''''+')')
				print @st
				exec (@st)		
				set @i=@i+1
			end
	end

FETCH NEXT FROM @CURSOR1 INTO @tname,@cname
END

CLOSE @CURSOR1


DROP TABLE #tmp1
6 фев 12, 07:17    [12037991]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
Klesk666
Member

Откуда:
Сообщений: 14
прогнал скрипт, почему то не работает :(
в чем ошибка?
6 фев 12, 08:43    [12038088]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
step_ks
Member

Откуда:
Сообщений: 936
а что не работает? вы бы эти char() затащили лучше внутрь от греха подальше и для читаемости результируещего скрипта.
6 фев 12, 08:55    [12038109]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
Klesk666
Member

Откуда:
Сообщений: 14
не убираются символы, хотя принт выдает
(1413 row(s) affected)
Update dbo.SC9323 set SP9325 = REPLACE (SP9325,'','')

(3 row(s) affected)
Update dbo.SC9323 set SP9325 = REPLACE (SP9325,'','')

(3 row(s) affected)
Update dbo.SC9323 set SP9325 = REPLACE (SP9325,'','')

(3 row(s) affected)
Update dbo.SC9323 set SP9325 = REPLACE (SP9325,'','')

(3 row(s) affected)
Update dbo.SC9323 set SP9325 = REPLACE (SP9325,'','')

(3 row(s) affected)
Update dbo.SC9323 set SP9325 = REPLACE (SP9325,'','')
6 фев 12, 08:59    [12038124]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
step_ks
Member

Откуда:
Сообщений: 936
как проверяете, что не убираются?
6 фев 12, 09:02    [12038132]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
Klesk666
Member

Откуда:
Сообщений: 14
select SP672 from dbo.SC503 where SP672 like '%'+char(10)+'%'
и
select SP672 from dbo.SC503 where SP672 like '%'+char(9)+'%'
возвращают результаты
6 фев 12, 09:21    [12038207]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
Klesk666
Member

Откуда:
Сообщений: 14
а всё, у этого поля тип text не учел, спасибо.
6 фев 12, 09:23    [12038215]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
Klesk666
Member

Откуда:
Сообщений: 14
Argument data type text is invalid for argument 1 of replace function.

как обработать text?
6 фев 12, 09:26    [12038227]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
step_ks
Member

Откуда:
Сообщений: 936
версия сервера какая?
6 фев 12, 09:30    [12038241]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
Klesk666
Member

Откуда:
Сообщений: 14
step_ks
версия сервера какая?

2005
6 фев 12, 09:40    [12038300]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
[quot Klesk666]Argument data type text is invalid for argument 1 of replace function.

как обработать text?[/quot

CAST ( ntext as nvarchar(max))
6 фев 12, 09:43    [12038327]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
iljy
Member

Откуда:
Сообщений: 8711
Klesk666
step_ks
версия сервера какая?

2005


Измените типы полей на varchar(max), отработает быстро, жить станет проще.
6 фев 12, 10:03    [12038458]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
Klesk666
Member

Откуда:
Сообщений: 14
iljy
Klesk666
пропущено...

2005


Измените типы полей на varchar(max), отработает быстро, жить станет проще.

не могу, 1с скорее всего рухнет

Ken@t
а так не стоит?
set @st=ltrim('Update dbo.' + @tname + ' set '+@cname+' = ltrim(REPLACE (CONVERT(VARCHAR(8000),'+@cname+'),''' + char(@i) + ''','''+' '''+'))')

медленней будет?
6 фев 12, 10:13    [12038517]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
step_ks
Member

Откуда:
Сообщений: 936
а чойта в 8000, а не в max?
к тому же, вы и так запускаете на каждое поле 31 апдейт вместо одного, а заботитесь о скорости.
6 фев 12, 10:46    [12038706]     Ответить | Цитировать Сообщить модератору
 Re: Как заменить символы во всех таблицах в поле с одинаковым именем  [new]
Klesk666
Member

Откуда:
Сообщений: 14
step_ks
а чойта в 8000, а не в max?
к тому же, вы и так запускаете на каждое поле 31 апдейт вместо одного, а заботитесь о скорости.

ну так самое большое число пришедшее в голову
И еще вопрос, а если не 80000 а 800 быстрее будет? (800 хватит, чтоб ничего не усеклось)
или лучше lenght(text) ?

а можно сделать одним апдейтом?
6 фев 12, 10:52    [12038740]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить