Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/55: Рейтинг темы: голосов - 55, средняя оценка - 4.73
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429

Ошибка преобразования значения varchar в тип данных int

12.12.2016, 12:53. Показов 12007. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток!

Есть три простые таблицы в базе Shop:

первая - All_buy с данными о товарах:

SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(
 tovar_id INTEGER  IDENTITY (1,1) NOT NULL PRIMARY KEY,
 date_buy datetime NOT NULL,
 t_id INTEGER NOT NULL REFERENCES tovar(t_id),
);
 
  tovar_id |   date_buy     |t_id
----------------------------------
      1    |   2012-01-01   |  1
----------------------------------
      2    |   2012-02-02   |  2
----------------------------------
      3    |   2013-02-02   |  8
..................................
вторая - tovar с видами товаров
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
(
 t_id INTEGER  IDENTITY (1,1) NOT NULL PRIMARY KEY,
 t_name VARCHAR(50)NOT NULL
);
 
t_id       |   t_name   
----------------------------------
      1    |    fridge
----------------------------------
      2    |   iron  
----------------------------------
      3    |   kettle
..................................
и третья Users - с пользователями, и разрешениями - в поле u_permission задано какие группы товаров они должны видеть - кто то должен видеть только товары 1-й группы, кто то только 45-й и 80-й и тд
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
(
 u_id INTEGER  IDENTITY (1,1) NOT NULL PRIMARY KEY,
 u_name VARCHAR(50)    NOT NULL
 u_permission VARCHAR(50)    NOT NULL
);
 
u_id       |    u_name      |  u_permisson
---------------------------------------------
      1    |   Stepanov     |     '1','2' 
--------------------------------------------
      2    |   Sergeev      |      '2','4'
--------------------------------------------
      3    |   Pavlov       |    '34','76' 
..................................
Я хочу выводить только те товары, которые может видеть пользователь например Stepanov, делаю так:
SQL
1
2
3
4
5
6
7
8
9
10
11
12
SELECT          [shop].[dbo].[all_buy].[tov_id]
               ,[shop].[dbo].[all_buy].[date_buy]
               ,[shop].[dbo].[tovar].[t_name]
FROM [shop].[dbo].[all_buy],[shop].[dbo].[tovar]
 
WHERE 
 ([shop].[dbo].[tovar].[t_id]=[shop].[dbo].[all_buy].[t_id])
 
AND
 [shop].[dbo].[all_buy].[t_id] IN
 (SELECT [shop].[dbo].[users].[u_permission] FROM [shop].[dbo].[users] 
  WHERE [shop].[dbo].[users].[u_name]='Stepanov')
SQL
1
2
(SELECT [shop].[dbo].[users].[u_permission] FROM [shop].[dbo].[users] 
  WHERE [shop].[dbo].[users].[u_name]='Stepanov')
возвращает разрешения для Stepanov.
результат -
SQL
1
Ошибка преобразования значения VARCHAR "'1','2'" в тип данных INT.
но если написать вместо этого select
SQL
1
2
AND
 [shop].[dbo].[all_buy].[t_id] IN ('1','2')
то всё нормально выведет. Вопрос, почему не преобразуется поле , содержащее
'1','2'.
Спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.12.2016, 12:53
Ответы с готовыми решениями:

Ошибка преобразования значения varchar "МР-12" в тип данных int
не могу понять почему выдает ошибку (Ошибка преобразования значения varchar "МР-12" в тип данных int.) почему группу преобразует в...

Ошибка преобразования значения varchar "<NULL>" в тип данных int
use master GO CREATE DATABASE Библиотека GO USE Библиотека GO CREATE TABLE Абонент (Читбилет char(20) PRIMARY KEY, ...

Ошибка преобразования значения varchar
Использую следующую хранимку USE GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE . @Login TEXT,

12
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
12.12.2016, 12:59
потому, что '1' сервер умеет к int, а "'1','12'" нет
а так-то u_premission нарушает как минимум 1НФ
заведи справочник
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
12.12.2016, 13:16  [ТС]
pincet - спасибо за ответ.
а так-то u_premission нарушает как минимум 1НФ
заведи справочник
что Вы имеете ввиду здесь под справочником? Понял, почему первая нормальная форма нарушается, а где и как тогда хранить информацию о том, к каким группам товаров имеет доступ user, если таких групп несколько?
0
1116 / 761 / 183
Регистрация: 27.11.2009
Сообщений: 2,272
12.12.2016, 13:18
T-SQL
1
[t_id] IN ('''1'',''2''','''34'',''76''')
Вот тут, по-вашему, сервер должен полезть внутрь каких-то там строк, узнать,
что там, оказывается, некий текстовый список чисел, достать эти числа, сравнить с целым t_id... Да?

Либо надо парсить это строковое поле в таблицу числовых записей, после чего джойнить с основной таблицей,
либо писать какой-нибудь тормознутый костыль вроде
T-SQL
1
','+[u_permission]+',' LIKE '%,'''+CAST(t_id AS VARCHAR)+''',%'
1
 Аватар для pincet
1654 / 1153 / 173
Регистрация: 23.07.2010
Сообщений: 6,910
12.12.2016, 14:00
{User_id;Group_id}
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
12.12.2016, 14:08  [ТС]
{User_id;Group_id}
-спасибо за ответ)
а что будет в Group_id - айдишник из таблицы группы, в которой будет что? такие же перечисления как в u_permission - нет, как тогда несколько разрешений хранить?
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
12.12.2016, 14:13
Цитата Сообщение от Landser Посмотреть сообщение
айдишник из таблицы группы, в которой будет что?
ну если 45-а, 80-я группа ничего не значат, а просто нумерация которую все каким-то образом в голове хранят, то не Group_id а Group_Num
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
12.12.2016, 14:25  [ТС]
ну если 45-а, 80-я группа ничего не значат, а просто нумерация которую все каким-то образом в голове хранят, то не Group_id а Group_Num
ну то есть не значат - это только айдишник товара из таблицы товары, которому соответствует название, например утюг.
когда печатаю таблицу All_buy, чтобы были не айдишники, а названия товаров я делаю
T-SQL
1
2
3
4
5
...............................
Select [shop].[dbo].[tovar].[t_name]
FROM [shop].[dbo].[all_buy],[shop].[dbo].[tovar] 
WHERE 
 ([shop].[dbo].[tovar].[t_id]=[shop].[dbo].[all_buy].[t_id])
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
12.12.2016, 14:34
при чем здесь товар, если мы говорим о группах, которые стояли в поле Users.u_permisson и которым ты кроме Group_id больше других атрибутов и придумать не можешь.

Глянул ещё раз выше,

UserPermitions (User_id , t_id) - так понятнее, что за таблица нужна?
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
12.12.2016, 15:04  [ТС]
YuryK спасибо большое за ответ.

UserPermitions (User_id , t_id) - так понятнее, что за таблица нужна?
не совсем, но чувствую, понимание где то близко
Доустим такая будет таблица UserPermitions
T-SQL
1
2
3
4
5
6
7
8
user_id    |   t_id
-----------------------------
      1    |      1
-----------------------------
      2    |      5
-----------------------------
      3    |      32
.............................
в t_id - айдишники товаров, которые разрешены юзеру с айди равным user_id, но как тогда назначить, чтобы несколько групп товаров было для каждого юзера, так что ли:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
user_id    |   t_id
-----------------------------
      1    |      1
-----------------------------
      2    |      5
-----------------------------
      3    |      32
.............................
-----------------------------
      2    |     2 5
.............................
-----------------------------
      2    |      47
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
12.12.2016, 15:29
да, для каждой группы товаров у каждого пользователя должна быть запись, сколько записей - к стольким группам есть доступ.

Добавлено через 9 минут
только групп я в твоих таблицах так и не вижу, т.е. доступ придется давать к каждому товару

а проблемный запрос станет таким

T-SQL
1
2
3
4
5
6
7
8
SELECT   [all_buy].[tov_id], [all_buy].[date_buy], [tovar].[t_name]
FROM 
  [users]
  JOIN [UserPermission] ON [UserPermission].[User_id] = [users].[u_id]
  JOIN [all_buy] ON [UserPermission].[t_id] = [all_buy].[t_id] 
  JOIN [tovar] ON [all_buy].[t_id] = [tovar].t_id 
WHERE 
  [users].[u_name]='Stepanov'
1
 Аватар для Landser
57 / 7 / 4
Регистрация: 18.04.2009
Сообщений: 429
12.12.2016, 16:01  [ТС]
Спасибо большое за запрос! а All_buy надо с UserPermission связывать?
0
1040 / 856 / 335
Регистрация: 08.12.2016
Сообщений: 3,283
12.12.2016, 16:06
связь JOIN идентична условию в WHERE, т.к. оставит только те записи из all_buy, которым есть соответствие по [t_id] и в UserPermission.

Просто стиль твоего первоначального запроса, где таблицы через запятую, а связи в WHERE терпеть не могу, т.к. пропустить связь при множестве таблиц очень просто.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.12.2016, 16:06
Помогаю со студенческими работами здесь

Преобразование типа данных varchar в тип данных smalldatetime привело к выходу значения за пределы диапазона
Здравствуйте. помогите пожалуйста. что может привести к этой ошибке(ошибка в заголовке темы)? DECLARE @counter int, ...

Ошибка "Преобразование значения типа varchar привело к переполнению столбца типа int" ?
Проблемы с SQL Server Создал таблицу: use LivlagsBar go IF EXISTS (SELECT name FROM sys.objects WHERE name =...

Преобразовать тип данных поля INT в FLOAT
День добрый. Подскажите как сделать преобразование поля, у меня на сервере есть таблица &quot;Оплата&quot; с полем Сумма ( Тип...

ID имеет тип varchar
Как связывать таблицы с помощью JOIN, если Id одной из них (или обоих) имеет тип varchar/nchar?

Как конвертировать тип text в varchar?
Доброго времени суток. Как конвертировать тип tex в varchar?? Если єто возможно.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru