Преобразование типов в MSSQL
От: A_l_e_x_e_y Россия  
Дата: 21.04.05 16:51
Оценка:
Столкнулся со странной проблемой.
Есть две таблицы.

Классификатор
Код int
Иерархия nvarchar

Данные
Код объекта int
Код атрибута int // Соответствует Классификатор.Код
Значение nvarchar

В таблице данные в поле Значение в виде строчки хранятся разные вещи(числа, строки, даты). Есть некоторое количество записей, в поле Значение которых хранятся целые числа.
Если выбирать их запросом
 SELECT CONVERT(int, [Значение]) FROM [Данные] WHERE ....

то все в порядке.
Но если немного усложнить запрос
 SELECT SUM(CONVERT(int, [Значение])) FROM [Данные] WHERE ....

То это не выполняется. Пишет, что
Syntax error converting the nvarchar value '0.0503' to a column of data type int.

При этом значение 0.0503 в таблице действительно есть, но появляться оно не должно.
Как можно с этим справиться?
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re: Преобразование типов в MSSQL
От: Chupa_Kabra  
Дата: 22.04.05 03:06
Оценка: +1
Здравствуйте, A_l_e_x_e_y, Вы писали:

A__>Столкнулся со странной проблемой.

A__>Есть две таблицы.

A__>Классификатор

A__>Код int
A__>Иерархия nvarchar

A__>Данные

A__>Код объекта int
A__>Код атрибута int // Соответствует Классификатор.Код
A__>Значение nvarchar

A__>В таблице данные в поле Значение в виде строчки хранятся разные вещи(числа, строки, даты). Есть некоторое количество записей, в поле Значение которых хранятся целые числа.

A__>Если выбирать их запросом
A__>
A__> SELECT CONVERT(int, [Значение]) FROM [Данные] WHERE ....
A__>

A__>то все в порядке.
A__>Но если немного усложнить запрос
A__>
A__> SELECT SUM(CONVERT(int, [Значение])) FROM [Данные] WHERE ....
A__>

A__>То это не выполняется. Пишет, что
A__>
A__>Syntax error converting the nvarchar value '0.0503' to a column of data type int.
A__>

A__>При этом значение 0.0503 в таблице действительно есть, но появляться оно не должно.
A__>Как можно с этим справиться?

А точно у вас в обоих случаях условия одинаковые ?
Все хотят хорошо провести время, но время не проведешь !
Re[2]: Преобразование типов в MSSQL
От: A_l_e_x_e_y Россия  
Дата: 22.04.05 07:44
Оценка:
Здравствуйте, Chupa_Kabra, Вы писали:
C_K>А точно у вас в обоих случаях условия одинаковые ?

Точно. Все что я делаю, это дописываю SUM. Остальная часть запроса остается той же самой.
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[3]: Преобразование типов в MSSQL
От: Chupa_Kabra  
Дата: 22.04.05 08:04
Оценка:
Здравствуйте, A_l_e_x_e_y, Вы писали:

A__>Здравствуйте, Chupa_Kabra, Вы писали:

C_K>>А точно у вас в обоих случаях условия одинаковые ?

A__>Точно. Все что я делаю, это дописываю SUM. Остальная часть запроса остается той же самой.

Очень странно.
А вот так работает ?

select sum([Значение]) from (SELECT CONVERT(int, [Значение]) [Значение] FROM [Данные] WHERE ....) z
Все хотят хорошо провести время, но время не проведешь !
Re[4]: Преобразование типов в MSSQL
От: A_l_e_x_e_y Россия  
Дата: 22.04.05 08:09
Оценка: -1
Здравствуйте, Chupa_Kabra, Вы писали:
C_K>
C_K>select sum([Значение]) from (SELECT CONVERT(int, [Значение]) [Значение] FROM [Данные] WHERE ....) z
C_K>

К сожалению MSSQL2000 так не умеет
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[5]: Преобразование типов в MSSQL
От: Chupa_Kabra  
Дата: 22.04.05 08:15
Оценка:
Здравствуйте, A_l_e_x_e_y, Вы писали:

A__>Здравствуйте, Chupa_Kabra, Вы писали:

C_K>>
C_K>>select sum([Значение]) from (SELECT CONVERT(int, [Значение]) [Значение] FROM [Данные] WHERE ....) z
C_K>>

A__>К сожалению MSSQL2000 так не умеет
Здрасти приплыли ...
Может вам BOL для начала почитать ?
Все хотят хорошо провести время, но время не проведешь !
Re[6]: Преобразование типов в MSSQL
От: A_l_e_x_e_y Россия  
Дата: 22.04.05 08:41
Оценка:
Здравствуйте, Chupa_Kabra, Вы писали:
A__>>К сожалению MSSQL2000 так не умеет
C_K>Здрасти приплыли ...
C_K>Может вам BOL для начала почитать ?
Я бы почитал, но нету . С инета слить я его не могу.

В том виде, в котором вы предложили попробовать запрос не работает. На него ругается парсер SQL Query аналяйзера. Можно конечно сделать через временную таблицу, но мне такой подход не нравится.
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[7]: Преобразование типов в MSSQL
От: Chupa_Kabra  
Дата: 22.04.05 08:43
Оценка: +1
Здравствуйте, A_l_e_x_e_y, Вы писали:

A__>Здравствуйте, Chupa_Kabra, Вы писали:

A__>>>К сожалению MSSQL2000 так не умеет
C_K>>Здрасти приплыли ...
C_K>>Может вам BOL для начала почитать ?
A__>Я бы почитал, но нету . С инета слить я его не могу.

A__>В том виде, в котором вы предложили попробовать запрос не работает. На него ругается парсер SQL Query аналяйзера. Можно конечно сделать через временную таблицу, но мне такой подход не нравится.

Я не предлагаю вам так оставлять, я предлагаю попробовать, что бы идентифицировать проблему.
Напишите полностью запрос и текст ошибки
Все хотят хорошо провести время, но время не проведешь !
Re: Преобразование типов в MSSQL
От: B0rG  
Дата: 22.04.05 09:42
Оценка:
Бывает ему крышу сносит...
Попробуйте сделать вьюху с конвертацией и по ней считать уже SUM. Может поможет.
Re[7]: Преобразование типов в MSSQL
От: B0rG  
Дата: 22.04.05 09:45
Оценка:
C_K>>Может вам BOL для начала почитать ?
A__>Я бы почитал, но нету . С инета слить я его не могу.

хммм... инета нету?
http://www.microsoft.com/sql/techinfo/productdoc/2000/books.asp
Re[8]: Преобразование типов в MSSQL
От: A_l_e_x_e_y Россия  
Дата: 22.04.05 09:50
Оценка:
Здравствуйте, B0rG, Вы писали:
BG>хммм... инета нету?
BG>http://www.microsoft.com/sql/techinfo/productdoc/2000/books.asp
Инет есть. Ссылку на файл я нашёл. НО размер файла 34мб. А через нашё проксю проходят файлы размером не более 20мб.
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[8]: Преобразование типов в MSSQL
От: A_l_e_x_e_y Россия  
Дата: 22.04.05 10:02
Оценка:
Здравствуйте, Chupa_Kabra, Вы писали:
К сожалению тот вариант условия where, который я раньше использовал, я потерял.
Но есть новый запрос

SELECT * 
FROM [Объекты НПО] 
WHERE  [Объекты НПО].[Код] = 30 OR
[Объекты НПО].[Код] IN
(SELECT CONVERT(int, [Значение]) FROM [Данные]
WHERE [Код объекта] = 30 AND [Код атрибута] IN (SELECT [Код] FROM [Классификатор] WHERE [Иерархия] LIKE '0202__01'))


Он выполняется нормально, если нет условия [Объекты НПО].[Код] = 30.
Если оно есть, то
Server: Msg 245, Level 16, State 1, Line 1
Syntax error converting the nvarchar value '427.5' to a column of data type int.
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[9]: Преобразование типов в MSSQL
От: B0rG  
Дата: 22.04.05 10:04
Оценка:
BG>>хммм... инета нету?
BG>>http://www.microsoft.com/sql/techinfo/productdoc/2000/books.asp
A__>Инет есть. Ссылку на файл я нашёл. НО размер файла 34мб. А через нашё проксю проходят файлы размером не более 20мб.

Не понимаю проблемы — сходите к начальству, скажите для работы необходимо — потому как действительно необходимо, пускай давит на админов.
Re[9]: Преобразование типов в MSSQL
От: Chupa_Kabra  
Дата: 22.04.05 10:15
Оценка:
Здравствуйте, A_l_e_x_e_y, Вы писали:

A__>Здравствуйте, Chupa_Kabra, Вы писали:

A__>К сожалению тот вариант условия where, который я раньше использовал, я потерял.
A__>Но есть новый запрос

A__>
A__>SELECT * 
A__>FROM [Объекты НПО] 
A__>WHERE  [Объекты НПО].[Код] = 30 OR
A__>[Объекты НПО].[Код] IN
A__>(SELECT CONVERT(int, [Значение]) FROM [Данные]
A__>WHERE [Код объекта] = 30 AND [Код атрибута] IN (SELECT [Код] FROM [Классификатор] WHERE [Иерархия] LIKE '0202__01'))
A__>


A__>Он выполняется нормально, если нет условия [Объекты НПО].[Код] = 30.

A__>Если оно есть, то
A__>
A__>Server: Msg 245, Level 16, State 1, Line 1
A__>Syntax error converting the nvarchar value '427.5' to a column of data type int.
A__>

Что то не нравится мне ваш запрос, если [Объекты НПО].[Код] — у вас строка, то вам лучше строкой и сравнивать
Почему у вас типы полей разные ?
Все хотят хорошо провести время, но время не проведешь !
Re: Преобразование типов в MSSQL
От: AntoxaM  
Дата: 22.04.05 10:29
Оценка:
Здравствуйте, A_l_e_x_e_y, Вы писали:

A__>Столкнулся со странной проблемой.

A__>...
A__>
A__>Syntax error converting the nvarchar value '0.0503' to a column of data type int.
A__>

A__>При этом значение 0.0503 в таблице действительно есть, но появляться оно не должно.
A__>Как можно с этим справиться?
а так:
SELECT SUM(CONVERT(int,CONVERT(numeric, [Значение])))...
Re[9]: Преобразование типов в MSSQL
От: Sinclair Россия https://github.com/evilguest/
Дата: 22.04.05 10:38
Оценка:
Здравствуйте, A_l_e_x_e_y, Вы писали:
SELECT * FROM [Объекты НПО]  WHERE  [Объекты НПО].[Код] = 30

что возвращает?
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: Преобразование типов в MSSQL
От: Chupa_Kabra  
Дата: 22.04.05 10:40
Оценка:
Здравствуйте, A_l_e_x_e_y, Вы писали:

A__>Здравствуйте, Chupa_Kabra, Вы писали:

A__>К сожалению тот вариант условия where, который я раньше использовал, я потерял.
A__>Но есть новый запрос

A__>
A__>SELECT * 
A__>FROM [Объекты НПО] 
A__>WHERE  [Объекты НПО].[Код] = 30 OR
A__>[Объекты НПО].[Код] IN
A__>(SELECT CONVERT(int, [Значение]) FROM [Данные]
A__>WHERE [Код объекта] = 30 AND [Код атрибута] IN (SELECT [Код] FROM [Классификатор] WHERE [Иерархия] LIKE '0202__01'))
A__>


A__>Он выполняется нормально, если нет условия [Объекты НПО].[Код] = 30.

A__>Если оно есть, то
A__>
A__>Server: Msg 245, Level 16, State 1, Line 1
A__>Syntax error converting the nvarchar value '427.5' to a column of data type int.
A__>

Структуру таблиц в студию
Все хотят хорошо провести время, но время не проведешь !
Re[10]: Преобразование типов в MSSQL
От: A_l_e_x_e_y Россия  
Дата: 22.04.05 11:00
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, A_l_e_x_e_y, Вы писали:

S>
S>SELECT * FROM [Объекты НПО]  WHERE  [Объекты НПО].[Код] = 30 
S>

S>что возвращает?

То, что и должно быть. Все значения правильные.
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[10]: Преобразование типов в MSSQL
От: A_l_e_x_e_y Россия  
Дата: 22.04.05 11:05
Оценка:
Здравствуйте, Chupa_Kabra, Вы писали:
C_K>Структуру таблиц в студию
Я опущу поля, которые не участвуют в запросе.

Классификатор
Код int
Иерархия nvarchar

Объекты НПО
Код int
Название nvarchar

Данные
Код int
Код атрибута int //свяано c Классификатор.Код
Код объекта int //связано с [Объекты НПО].[Код]
Значение nvarchar
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[10]: Преобразование типов в MSSQL
От: A_l_e_x_e_y Россия  
Дата: 22.04.05 11:05
Оценка:
Здравствуйте, B0rG, Вы писали:
BG>Не понимаю проблемы — сходите к начальству, скажите для работы необходимо — потому как действительно необходимо, пускай давит на админов.
Желание слить врозникло только сегодня. Так что схожу.
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[10]: Преобразование типов в MSSQL
От: A_l_e_x_e_y Россия  
Дата: 22.04.05 11:05
Оценка:
Здравствуйте, Chupa_Kabra, Вы писали:

C_K>Что то не нравится мне ваш запрос, если [Объекты НПО].[Код] — у вас строка, то вам лучше строкой и сравнивать

C_K>Почему у вас типы полей разные ?
[Объекты НПО].[Код] — int
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[10]: Преобразование типов в MSSQL
От: A_l_e_x_e_y Россия  
Дата: 22.04.05 11:15
Оценка:
Здравствуйте, B0rG, Вы писали:
BG>Не понимаю проблемы — сходите к начальству, скажите для работы необходимо — потому как действительно необходимо, пускай давит на админов.
Не успел ещё. Про этот док я узнал только сегодня.
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[11]: Преобразование типов в MSSQL
От: Sinclair Россия https://github.com/evilguest/
Дата: 22.04.05 11:20
Оценка:
Здравствуйте, A_l_e_x_e_y, Вы писали:
A__>То, что и должно быть. Все значения правильные.
Т.е. значения '427.5' нет?
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[11]: Преобразование типов в MSSQL
От: Chupa_Kabra  
Дата: 22.04.05 11:21
Оценка:
Здравствуйте, A_l_e_x_e_y, Вы писали:

A__>Здравствуйте, Chupa_Kabra, Вы писали:

C_K>>Структуру таблиц в студию
A__>Я опущу поля, которые не участвуют в запросе.

A__>
A__>Классификатор
A__>Код int
A__>Иерархия nvarchar

A__>Объекты НПО
A__>Код int
A__>Название nvarchar

A__>Данные
A__>Код int
A__>Код атрибута int //свяано c Классификатор.Код
A__>Код объекта int //связано с [Объекты НПО].[Код]
A__>Значение nvarchar
A__>

Попробуйте, должно сработать.

declare @tmp table(Value int primary key clustered)

insert into @tmp
(Value)
SELECT distinct CONVERT(int, [Значение]) FROM [Данные]
WHERE [Код объекта] = 30 AND [Код атрибута] IN (SELECT [Код] FROM [Классификатор] WHERE [Иерархия] LIKE '0202__01')

SELECT * 
FROM [Объекты НПО] 
WHERE  [Объекты НПО].[Код] = 30 OR
[Объекты НПО].[Код] IN (select Value from @tmp)


Вашу конструкцию оптимизатор может дооптимизировать, что к чем подсоеденяется можно посмотреть в плане выполнения запроса.
Все хотят хорошо провести время, но время не проведешь !
Re[12]: Преобразование типов в MSSQL
От: A_l_e_x_e_y Россия  
Дата: 22.04.05 11:32
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Здравствуйте, A_l_e_x_e_y, Вы писали:

A__>>То, что и должно быть. Все значения правильные.
S>Т.е. значения '427.5' нет?
Нет конечно. Значение 427.5 содержится в таблице Данные.
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[12]: Преобразование типов в MSSQL
От: A_l_e_x_e_y Россия  
Дата: 22.04.05 11:32
Оценка:
Здравствуйте, Chupa_Kabra, Вы писали:
Примерно то же самое я уже и сам написал, но хотелось бы обойтись без временных таблиц.
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[13]: Преобразование типов в MSSQL
От: Chupa_Kabra  
Дата: 22.04.05 11:47
Оценка:
Здравствуйте, A_l_e_x_e_y, Вы писали:

A__>Здравствуйте, Chupa_Kabra, Вы писали:

A__>Примерно то же самое я уже и сам написал,

Нужно полагать, что так работает ?
A__>но хотелось бы обойтись без временных таблиц.
Совершенно не очевидное решение, особенно при том, что оптимизатор по одному и тому же запросу может построить разные планы выполнения. А данный подход ничего другого ему не оставит
Все хотят хорошо провести время, но время не проведешь !
Re[14]: Преобразование типов в MSSQL
От: A_l_e_x_e_y Россия  
Дата: 22.04.05 12:03
Оценка:
Здравствуйте, Chupa_Kabra, Вы писали:
C_K>Нужно полагать, что так работает ?
Точно. Есть кстати еще вопрос. Как узнать, что временная таблица уже существует?

A__>>но хотелось бы обойтись без временных таблиц.

C_K>Совершенно не очевидное решение, особенно при том, что оптимизатор по одному и тому же запросу может построить разные планы выполнения. А данный подход ничего другого ему не оставит
К сожалению я не достатоно хорошо разбираюсь в MSSQL, чтобы это имело для меня большое значение.
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[15]: Преобразование типов в MSSQL
От: Chupa_Kabra  
Дата: 22.04.05 12:09
Оценка: 3 (1)
Здравствуйте, A_l_e_x_e_y, Вы писали:

A__>Здравствуйте, Chupa_Kabra, Вы писали:

C_K>>Нужно полагать, что так работает ?
A__>Точно. Есть кстати еще вопрос. Как узнать, что временная таблица уже существует?

Есть несколько типов временных таблиц. Та что использовалась в моем запросе это таблица-переменная, со всеми вытекающими отсюда последствиями. То она за вас ни где не создастся.
Не рекомендуется в нее толкать много данных, это будет тормозить.
Есть еще локальные и глобальные временные таблицы, разница у них в области видимости между процессами. Все они реально хранятся в tempdb...
В общем скачайте BOL (это не MSDN все таки) и читайте:

Temporary Tables
You can create local and global temporary tables. Local temporary tables are visible only in the current session; global temporary tables are visible to all sessions.

Prefix local temporary table names with single number sign (#table_name), and prefix global temporary table names with a double number sign (##table_name).

SQL statements reference the temporary table using the value specified for table_name in the CREATE TABLE statement:

CREATE TABLE #MyTempTable (cola INT PRIMARY KEY)
INSERT INTO #MyTempTable VALUES (1)

If a local temporary table is created in a stored procedure or application that can be executed at the same time by several users, SQL Server has to be able to distinguish the tables created by the different users. SQL Server does this by internally appending a numeric suffix to each local temporary table name. The full name of a temporary table as stored in the sysobjects table in tempdb consists of table name specified in the CREATE TABLE statement and the system-generated numeric suffix. To allow for the suffix, table_name specified for a local temporary name cannot exceed 116 characters.

Temporary tables are automatically dropped when they go out of scope, unless explicitly dropped using DROP TABLE:

A local temporary table created in a stored procedure is dropped automatically when the stored procedure completes. The table can be referenced by any nested stored procedures executed by the stored procedure that created the table. The table cannot be referenced by the process which called the stored procedure that created the table.


All other local temporary tables are dropped automatically at the end of the current session.


Global temporary tables are automatically dropped when the session that created the table ends and all other tasks have stopped referencing them. The association between a task and a table is maintained only for the life of a single Transact-SQL statement. This means that a global temporary table is dropped at the completion of the last Transact-SQL statement that was actively referencing the table when the creating session ended.
A local temporary table created within a stored procedure or trigger is distinct from a temporary table with the same name created before the stored procedure or trigger is called. If a query references a temporary table, and two temporary tables with the same name exist at that time, it is not defined which table the query is resolved against. Nested stored procedures can also create temporary tables with the same name as a temporary table created by the stored procedure that called it. All references to the table name in the nested stored procedure are resolved to the table created in the nested procedure, for example:

CREATE PROCEDURE Test2
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (2)
SELECT Test2Col = x FROM #t
GO
CREATE PROCEDURE Test1
AS
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (1)
SELECT Test1Col = x FROM #t
EXEC Test2
GO
CREATE TABLE #t(x INT PRIMARY KEY)
INSERT INTO #t VALUES (99)
GO
EXEC Test1
GO

Here is the result set:


A__>>>но хотелось бы обойтись без временных таблиц.

C_K>>Совершенно не очевидное решение, особенно при том, что оптимизатор по одному и тому же запросу может построить разные планы выполнения. А данный подход ничего другого ему не оставит
A__>К сожалению я не достатоно хорошо разбираюсь в MSSQL, чтобы это имело для меня большое значение.
Все хотят хорошо провести время, но время не проведешь !
Re[16]: Преобразование типов в MSSQL
От: A_l_e_x_e_y Россия  
Дата: 22.04.05 12:20
Оценка:
Здравствуйте, Chupa_Kabra, Вы писали:
Большое спасибо! Все заработало!
... << RSDN@Home 1.1.4 beta 5 rev. 0>>
Re[17]: Преобразование типов в MSSQL
От: rbrunets Украина  
Дата: 23.04.05 14:41
Оценка:
A_l_e_x_e_y пишет:
> Здравствуйте, Chupa_Kabra, Вы писали:
> Большое спасибо! Все заработало!

И проверь collation на базе и temp_db. Они у тебя, похоже, разные.
Posted via RSDN NNTP Server 1.9


Всё, что нас не убивает, ещё горько об этом пожалеет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.