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

Откуда: Питер, Москва
Сообщений: 4090
create table t1
(
p decimal(16, 0)
)
GO
insert into t1 (p)
values (1)
insert into t1 (p)
values (2)
insert into t1 (p)
values (3)
GO
SELECT * FROM t1 WHERE p IN (1,2,3)
автор
1
2
3


вот такая конструкция, где вместо списка переменная, не работает: Ошибка при преобразовании типа данных varchar к numeric.
помогите исправить
автор
begin
DECLARE @V_p varchar(250)
SET @V_p = '1,2,3'
SELECT * FROM t1 WHERE p IN (@V_p)
end
9 окт 14, 11:55    [16680941]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
nizamovich
Member

Откуда: Москва
Сообщений: 116
Aliona,

у тебя в тексте ошибки написано , что не может сконвертить текст в число

[src]
SET @V_p = '1,2,3' - это текст
[/SRC ]
9 окт 14, 11:57    [16680966]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8828
Aliona,

create table #t1 (f1 int)
insert into #t1 values (1),(2),(3)

select * from t1 inner join #t1 on t1.p=#t1.f1


IN() должен иметь список аргументов, Вы пытаетесь выполнить что-то вроде макроподстановки.
Decimal без нужды нехорошо использовать.
9 окт 14, 12:00    [16680998]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
Добрый Э - Эх
Guest
Aliona,

как вариант - предварительно распарсь свою переменную-список в таблицу-список. и замени IN на JOIN. :)
9 окт 14, 12:02    [16681009]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
Glory
Member

Откуда:
Сообщений: 104751
Aliona
помогите исправить

Не используйте для хранения списков символьные переменные.
Используйте таблицы.
9 окт 14, 12:03    [16681021]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
Aliona
Member

Откуда: Питер, Москва
Сообщений: 4090
Владислав Колосов
IN() должен иметь список аргументов, Вы пытаетесь выполнить что-то вроде макроподстановки.
Decimal без нужды нехорошо использовать.


Поле Decimal стоит там где нужно.

Я перевожу оракловые скрипты на ms sql.
там всё довольно просто с переменными подстановки
автор
DEFINE V_SRV = (1,2,3)

INSERT INTO t2
SELECT *
FROM t1 WHERE SRV_DISTRICT_ID IN &&V_SRV


неужели на t-sql нельзя написать что-то такое простое?
9 окт 14, 12:36    [16681185]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
VGalamakh
Member

Откуда: Киев (Альба)
Сообщений: 66
Если решили идти таким путем, о

begin
DECLARE @V_p varchar(250)
SET @V_p = '1,2,3'
SELECT * FROM t1
WHERE CHARINDEX(cast(p as varchar)+',',@V_p+',',1)>0
end
9 окт 14, 12:45    [16681234]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8828
Aliona,

макроподстановки - вовсе не простая вещь, хотя выглядит просто. Мы Вам намеренно не предлагаем использовать динамический запрос, т.к. это неоптимально в данном случае.

Насчет Decimal Вы ошибаетесь, т.к. используете целочисленное представление (16,0). Использование Decimal здесь неоптимально (9 байт vs 4 и другая математика для обработки). Впрочем, понятно, откуда ноги растут - на Oracle всё Numeric.
9 окт 14, 12:47    [16681240]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
Glory
Member

Откуда:
Сообщений: 104751
Aliona
неужели на t-sql нельзя написать что-то такое простое?

Разумеется можно
declare @V_SRV table(f1 int) 
INSERT @V_SRV values(1),(2),(3)


INSERT INTO t2
SELECT *
FROM t1 WHERE SRV_DISTRICT_ID IN(SELECT f1 FROM @V_SRV)
9 окт 14, 12:52    [16681282]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
DECLARE @V_p varchar(250)
SET @V_p = '1,2,3'
SELECT * FROM t1 WHERE p IN (@V_p)
DECLARE @V_p varchar(250)
SET @V_p = ',1,2,3,'
SELECT * FROM t1 WHERE @V_p LIKE '%,'+CAST(p AS VARCHAR)+',%' 
Об индексах забудьте!
9 окт 14, 13:17    [16681489]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
Aliona
Member

Откуда: Питер, Москва
Сообщений: 4090
VGalamakh
Если решили идти таким путем, о

begin
DECLARE @V_p varchar(250)
SET @V_p = '1,2,3'
SELECT * FROM t1
WHERE CHARINDEX(cast(p as varchar)+',',@V_p+',',1)>0
end

спасибо!
получилось, хотя вот этот зверь "CHARINDEX" мне совсем не знаком.
9 окт 14, 13:26    [16681561]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
Aliona
Member

Откуда: Питер, Москва
Сообщений: 4090
Большое спасибо!
Остальные варианты тоже попробую.
9 окт 14, 13:28    [16681574]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
Добрый Э - Эх
Guest
Aliona
получилось, хотя вот этот зверь "CHARINDEX" мне совсем не знаком.
это аналог ораклового INSTR
9 окт 14, 13:31    [16681608]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
VGalamakh
Member

Откуда: Киев (Альба)
Сообщений: 66
Aliona
VGalamakh
Если решили идти таким путем, о

begin
DECLARE @V_p varchar(250)
SET @V_p = '1,2,3'
SELECT * FROM t1
WHERE CHARINDEX(cast(p as varchar)+',',@V_p+',',1)>0
end

спасибо!
получилось, хотя вот этот зверь "CHARINDEX" мне совсем не знаком.


Не делайте так, это было только для примера.

лучше - "Не используйте для хранения списков символьные переменные.Используйте таблицы. "
9 окт 14, 13:42    [16681711]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
Aliona
VGalamakh
Если решили идти таким путем, о

begin
DECLARE @V_p varchar(250)
SET @V_p = '1,2,3'
SELECT * FROM t1
WHERE CHARINDEX(cast(p as varchar)+',',@V_p+',',1)>0
end

спасибо!
получилось, хотя вот этот зверь "CHARINDEX" мне совсем не знаком.


Смелая и дерзкая! респект
9 окт 14, 14:00    [16681843]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
Glory
Member

Откуда:
Сообщений: 104751
Winnipuh
Смелая и дерзкая! респект

Aliona переводит оракловые скрипты на ms sql для того, чтобы они были переведены. А не для того, чтобы они хорошо работали на mssql.
Имхо.
9 окт 14, 14:20    [16682010]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
Aliona
Member

Откуда: Питер, Москва
Сообщений: 4090
Я не собираюсь работать с ms sql, мне просто нужна помощь,
в данный момент работаю сисадмином.
По-моему, нельзя быть крутым спецом во всём, поэтому я к этому и не стремлюсь.

Вы, как я погляжу, действительно дворником (модератором) работаете, выметаете и разгоняете всех новеньких или просто просящих помощи.
Успехов Вам в ваших начинаниях.
10 окт 14, 14:17    [16687477]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
Glory
Member

Откуда:
Сообщений: 104751
Aliona
Вы, как я погляжу, действительно дворником (модератором) работаете, выметаете и разгоняете всех новеньких или просто просящих помощи.

Если просящий помощи выбирает худшее решение из предложенных, то его не только с форума надо гнать, а еще и из сисадминов.
10 окт 14, 14:24    [16687519]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
Aliona
Я не собираюсь работать с ms sql, мне просто нужна помощь,
в данный момент работаю сисадмином.


Надо всё делать профессионально, даже если это не ваша главная специализация.
10 окт 14, 15:15    [16687836]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с синтаксисом: where ... in  [new]
Aliona
Member

Откуда: Питер, Москва
Сообщений: 4090
На этой счастливой ноте и закроем тему :)
10 окт 14, 15:16    [16687843]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить