#asp.net #mysql #sql #sql-server-2005 #tsql
#asp.net #mysql #sql #sql-server-2005 #tsql
Вопрос:
У меня есть простая таблица sql, в которой есть имя двух столбцов, и оба идентификатора — varchar (10); Теперь у меня есть значение в таблице типа (‘Test’, ‘1,2,3’). У нас есть другая таблица для получения полных сведений о сотруднике , но столбец Ids в tblEmployee имеет значение int. следующий SQL выдаст ошибку,
Выберите * из tblEmployee, где идентификаторы в (Выберите идентификаторы из tblNameId, где name =’Test’);
Ошибка: не удается преобразовать 1,2,3 в int. Это их способ преобразовать все значения в int или любой другой обходной путь.
Спасибо.
Ответ №1:
Используйте следующую функцию для разделения текста
CREATE FUNCTION dbo.Split(@String varchar(8000))
returns @temptable TABLE (items int)
as
begin
declare @idx int
declare @slice varchar(8000)
select @idx = 1
if len(@String)<1 or @String is null return
while @idx!= 0
begin
set @idx = charindex(',',@String)
if @idx!=0
set @slice = left(@String,@idx - 1)
else
set @slice = @String
if(len(@slice)>0)
insert into @temptable(Items) values(CONVERT(INT, @slice))
set @String = right(@String,len(@String) - @idx)
if len(@String) = 0 break
end
return
end
Затем
Select * from tblEmployee where Ids in dbo.Split(Select Ids from tblNameId where name='Test');
(адаптировано с этого сайта: http://www.logiclabz.com/sql-server/split-function-in-sql-server-to-break-comma-separated-strings-into-table.aspx )
Ответ №2:
Похоже, у вас действительно есть список целых чисел, разделенных запятыми. Вы могли бы запросить что-то вроде:
select *
from tblEmployee e
join tblNameId ni
on ',' ni.Ids ',' like '%,' cast(e.Ids as varchar(12)) ',%'
Более чистый дизайн привел бы к нормализации tblNameId
таблицы с одной строкой для каждого идентификатора сотрудника.
Комментарии:
1. like может быть очень медленным в зависимости от данных