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

Откуда:
Сообщений: 93
Есть табличка с полем типа text, которое содержит значения id на другие таблицы в таком виде 1,2,3,4,5..., понимаю что бред но так было организовано. Необходимо разобрать эти значения и разместить в поле типа INT, и вот тут проблема с объявлением переменных типа text. Решил передать в качестве параметра в процедуру. Но тут так же проблема с выполнением батча.

CREATE PROCEDURE #sp_ConvertRoadIDToCentral
@STR TEXT
AS

SET @STR='INSER INTO table2 (id) SELECT id FROM Table1 WHERE id2 IN('+@STR+')'
EXEC sp_executesql @STR

GO
16 ноя 12, 09:04    [13481752]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31865
Garisson,

А версия сиквела какая?
16 ноя 12, 09:26    [13481833]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
Garisson
Member

Откуда:
Сообщений: 93
alexeyvg
Garisson,

А версия сиквела какая?


2000
16 ноя 12, 09:32    [13481851]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
invm
Member

Откуда: Москва
Сообщений: 9723
Что вернет
select max(datalength([поле типа text])) from Таблица
?
16 ноя 12, 10:07    [13481981]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
Garisson
Member

Откуда:
Сообщений: 93
invm
Что вернет
select max(datalength([поле типа text])) from Таблица
?



8091, но может быть и больше
16 ноя 12, 10:12    [13482006]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
Garisson
Есть табличка с полем типа text, которое содержит значения id на другие таблицы в таком виде 1,2,3,4,5..., понимаю что бред но так было организовано. Необходимо разобрать эти значения и разместить в поле типа INT, и вот тут проблема с объявлением переменных типа text. Решил передать в качестве параметра в процедуру. Но тут так же проблема с выполнением батча.

CREATE PROCEDURE #sp_ConvertRoadIDToCentral
@STR TEXT
AS

SET @STR='INSER INTO table2 (id) SELECT id FROM Table1 WHERE id2 IN('+@STR+')'
EXEC sp_executesql @STR

GO
INSERT table2(id) SELECT id FROM Table1 WHERE ','+id2+',' LIKE '%,'+@STR+',%';
Зачем динамический SQL так и не понял.
LIKE, если не ошибаюсь, спокойненько с BLOBами работает.
16 ноя 12, 10:14    [13482022]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
iap
Garisson
Есть табличка с полем типа text, которое содержит значения id на другие таблицы в таком виде 1,2,3,4,5..., понимаю что бред но так было организовано. Необходимо разобрать эти значения и разместить в поле типа INT, и вот тут проблема с объявлением переменных типа text. Решил передать в качестве параметра в процедуру. Но тут так же проблема с выполнением батча.

CREATE PROCEDURE #sp_ConvertRoadIDToCentral
@STR TEXT
AS

SET @STR='INSER INTO table2 (id) SELECT id FROM Table1 WHERE id2 IN('+@STR+')'
EXEC sp_executesql @STR

GO
INSERT table2(id) SELECT id FROM Table1 WHERE ','+id2+',' LIKE '%,'+@STR+',%';
Зачем динамический SQL так и не понял.
LIKE, если не ошибаюсь, спокойненько с BLOBами работает.
Наоборот, конечно
INSERT table2(id) SELECT id FROM Table1 WHERE ','+@STR+',' LIKE '%,'+id2+',%';
16 ноя 12, 10:15    [13482033]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
Но к параметру типа TEXT так просто запятую не добавишь...
TEXTPTR, READTEXT, WRITETEXT, UPDATETEXT и т.д.
16 ноя 12, 10:22    [13482074]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
rast
Member

Откуда: Москва
Сообщений: 70
iap, можно последний запрос подробно разобрать для непосвященных?
16 ноя 12, 10:34    [13482173]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
rast
iap, можно последний запрос подробно разобрать для непосвященных?
Я ж только что написал, что он в таком виде не отработает из-за типа TEXT
Или имеется в виду что-то другое?
Вообще-то, это запрос не совсем мой, ибо всё, кроме WHERE, написал ТС.
В том же первом сообщении сказано, что @STR - это список чисел через запятую.
Надо определить, входит ли конкретное число в этот список.
16 ноя 12, 10:40    [13482218]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
Если id2 типа int, то его ещё и кастить к строке придётся
16 ноя 12, 10:42    [13482233]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31865
Garisson
alexeyvg
Garisson,

А версия сиквела какая?


2000
Тогда можно так:
CREATE PROCEDURE #sp_ConvertRoadIDToCentral
@STR TEXT
AS

EXEC ('INSER INTO table2 (id) SELECT id FROM Table1 WHERE id2 IN('+@STR+')')
16 ноя 12, 10:46    [13482260]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
rast
Member

Откуда: Москва
Сообщений: 70
iap, меня заинтересовала запись в условии.
Не понимаю как она работает. Может укажите где почитать?
16 ноя 12, 10:48    [13482279]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
alexeyvg
Garisson
пропущено...


2000
Тогда можно так:
CREATE PROCEDURE #sp_ConvertRoadIDToCentral
@STR TEXT
AS

EXEC ('INSER INTO table2 (id) SELECT id FROM Table1 WHERE id2 IN('+@STR+')')
К параметру типа TEXT нельзя что-то прибавить оператором "+". Попробуйте сами.
Автору темы выражаю соболезнование и советую перейти на сервер >=SQL2005
16 ноя 12, 10:50    [13482294]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
iap
alexeyvg
пропущено...
Тогда можно так:
CREATE PROCEDURE #sp_ConvertRoadIDToCentral
@STR TEXT
AS

EXEC ('INSER INTO table2 (id) SELECT id FROM Table1 WHERE id2 IN('+@STR+')')
К параметру типа TEXT нельзя что-то прибавить оператором "+". Попробуйте сами.
Автору темы выражаю соболезнование и советую перейти на сервер >=SQL2005
Ещё правильнее проектировать правильную структуру БД,
с соблюдением основ реляционной теории и принципов нормализации отношений.
Тогда и извращаться не придётся. Независимо от версии.
16 ноя 12, 10:54    [13482324]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
rast
iap, меня заинтересовала запись в условии.
Не понимаю как она работает. Может укажите где почитать?
Про оператор LIKE?
Скажу банальность: в BOL.
16 ноя 12, 10:57    [13482345]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31865
iap
alexeyvg
Тогда можно так:
К параметру типа TEXT нельзя что-то прибавить оператором "+". Попробуйте сами.
Можно, это особенность команды EXE() ещё с версий 6.0 :-)

CREATE PROCEDURE #sp_ConvertRoadIDToCentral
@STR TEXT
AS
create table #t(id int)
EXEC ('INSERT INTO #t(id) SELECT id FROM sysobjects WHERE id IN('+@STR+')')
GO
exec #sp_ConvertRoadIDToCentral '1'
go
DROP PROCEDURE #sp_ConvertRoadIDToCentral
16 ноя 12, 11:00    [13482376]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
Garisson
Member

Откуда:
Сообщений: 93
вот написал но походу зря, получаю ошибку с LIKE

IF EXISTS(SELECT name FROM sysobjects WHERE name = '#sp_Convert' AND type = 'P')
DROP PROCEDURE #sp_Convert
GO
CREATE PROCEDURE #sp_Convert
@STR TEXT
AS
if exists (select * from tempdb.dbo.sysobjects where id = object_id('tempdb..#tab1'))
drop table #tab1
CREATE TABLE #tab1 (id INT,STR1 TEXT)
INSERT INTO #tab1 (id) VALUES(1)
INSERT INTO #tab1 (id) VALUES(2)
INSERT INTO #tab1 (id) VALUES(3)
INSERT INTO #tab1 (id) VALUES(4)

SELECT * FROM #tab1 WHERE ','+@STR+',' LIKE '%,'+CONVERT(VARCHAR(50),id)+',%'

GO
16 ноя 12, 11:05    [13482406]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
Garisson
Member

Откуда:
Сообщений: 93
забыл вызов
EXEC #sp_Convert '3,12,15,18,'--как будто использовали TEXTPTR и UPDATETEXT получив запятую в конце
16 ноя 12, 11:07    [13482425]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
Garisson
вот написал но походу зря, получаю ошибку с LIKE

IF EXISTS(SELECT name FROM sysobjects WHERE name = '#sp_Convert' AND type = 'P')
DROP PROCEDURE #sp_Convert
GO
CREATE PROCEDURE #sp_Convert
@STR TEXT
AS
if exists (select * from tempdb.dbo.sysobjects where id = object_id('tempdb..#tab1'))
drop table #tab1
CREATE TABLE #tab1 (id INT,STR1 TEXT)
INSERT INTO #tab1 (id) VALUES(1)
INSERT INTO #tab1 (id) VALUES(2)
INSERT INTO #tab1 (id) VALUES(3)
INSERT INTO #tab1 (id) VALUES(4)

SELECT * FROM #tab1 WHERE ','+@STR+',' LIKE '%,'+CONVERT(VARCHAR(50),id)+',%'

GO
Ошибка не с LIKE, а с оператором '+' в применении к TEXT.
Вот если бы @STR гарантированно начинался и заканчивался запятыми...
Но можно, в конце концов, и так:
WHERE @STR LIKE '%,'+CAST(id AS VARCHAR(50))+',%'
   OR @STR LIKE      CAST(id AS VARCHAR(50))+',%'
   OR @STR LIKE '%,'+CAST(id AS VARCHAR(50))
   OR @STR LIKE      CAST(id AS VARCHAR(50))
16 ноя 12, 11:12    [13482460]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
Garisson
Member

Откуда:
Сообщений: 93
alexeyvg
iap
пропущено...
К параметру типа TEXT нельзя что-то прибавить оператором "+". Попробуйте сами.
Можно, это особенность команды EXE() ещё с версий 6.0 :-)

CREATE PROCEDURE #sp_ConvertRoadIDToCentral
@STR TEXT
AS
create table #t(id int)
EXEC ('INSERT INTO #t(id) SELECT id FROM sysobjects WHERE id IN('+@STR+')')
GO
exec #sp_ConvertRoadIDToCentral '1'
go
DROP PROCEDURE #sp_ConvertRoadIDToCentral


Спасибо огромное это то что надо!!!
16 ноя 12, 11:15    [13482484]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
Garisson
Member

Откуда:
Сообщений: 93
iap
Garisson
вот написал но походу зря, получаю ошибку с LIKE

IF EXISTS(SELECT name FROM sysobjects WHERE name = '#sp_Convert' AND type = 'P')
DROP PROCEDURE #sp_Convert
GO
CREATE PROCEDURE #sp_Convert
@STR TEXT
AS
if exists (select * from tempdb.dbo.sysobjects where id = object_id('tempdb..#tab1'))
drop table #tab1
CREATE TABLE #tab1 (id INT,STR1 TEXT)
INSERT INTO #tab1 (id) VALUES(1)
INSERT INTO #tab1 (id) VALUES(2)
INSERT INTO #tab1 (id) VALUES(3)
INSERT INTO #tab1 (id) VALUES(4)

SELECT * FROM #tab1 WHERE ','+@STR+',' LIKE '%,'+CONVERT(VARCHAR(50),id)+',%'

GO
Ошибка не с LIKE, а с оператором '+' в применении к TEXT.
Вот если бы @STR гарантированно начинался и заканчивался запятыми...
Но можно, в конце концов, и так:
WHERE @STR LIKE '%,'+CAST(id AS VARCHAR(50))+',%'
   OR @STR LIKE      CAST(id AS VARCHAR(50))+',%'
   OR @STR LIKE '%,'+CAST(id AS VARCHAR(50))
   OR @STR LIKE      CAST(id AS VARCHAR(50))

Спасибо jap вариант то же хороший.
16 ноя 12, 11:18    [13482499]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
Garisson
Member

Откуда:
Сообщений: 93
продолжая данный процесс уперся в потребность вызывать процедуру у которой
в качестве входного параметра результат запроса:

CREATE PROCEDURE #sp_ConvertRoadIDToCentral
@STR TEXT
AS
create table #t(id int)
EXEC ('INSERT INTO #t(id) SELECT id FROM sysobjects WHERE id IN('+@STR+')')
SELECT * FROM #t
GO

exec #sp_ConvertRoadIDToCentral EXEC('SELECT ''1,2,3''')
go

DROP PROCEDURE #sp_ConvertRoadIDToCentral
DROP TABLE #t

получаю ошибку, можно ли как то поправить синтаксис?
16 ноя 12, 14:56    [13484390]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
Garisson
можно ли как то поправить синтаксис?
"На деревню дедушке Биллу Гейтсу"
16 ноя 12, 15:11    [13484494]     Ответить | Цитировать Сообщить модератору
 Re: Разобрать значение из поля типа TEXT  [new]
Alexander63
Member

Откуда: Одинцово
Сообщений: 273
Garisson,

На просторах интернета встречал процедуру, которая строку вида '1,2,3,4,56,12,11, ...' преобразует в таблицу со столбцом целых чисел. Это конечно, если у вас в поле TEXT только числа через запятую или любой другой разделитель. Может быть это то, что нужно Вам.
16 ноя 12, 15:12    [13484503]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить