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

Откуда:
Сообщений: 42
Добрый день. Помогите исправить функцию.
В функции требуется вывести все отделы и сотрудников относящихся к каждому отделу. Проблема в том, что все сотрудники выводятся нормально ( Имя + Фамилия ) а у первого сотрудника (каждого отдела) выводится только имя. Без фамилии. В чём я ошибся?
USE AdventureWorks2008
GO
IF OBJECT_ID (N'dbo.UDF', N'FN') IS NOT NULL
    DROP FUNCTION dbo.UDF;
GO
CREATE FUNCTION dbo.UDF(@Name varchar(1000))
RETURNS NVARCHAR(1000)
AS
BEGIN
DECLARE @Result NVARCHAR(1000)
SET @Result = ''
SELECT @Result = @Result + ([FirstName] + ', ' + LastName) 
FROM																Person.Person p 
																	join HumanResources.Employee h ON p.BusinessEntityID = h.BusinessEntityID 
																	join HumanResources.EmployeeDepartmentHistory d ON h.BusinessEntityID = d.BusinessEntityID
																	join HumanResources.Department b ON d.DepartmentID = b.DepartmentID 
WHERE Name = @Name
RETURN '"' + RTRIM(@Result) + '"'
END
GO
SELECT  Name,  dbo.UDF(Name) FROM HumanResources.Department
19 авг 14, 11:47    [16461217]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
Jovanny
Member

Откуда:
Сообщений: 1196
Немного непонятна конструкция
SELECT @Result = @Result +...

Рекурсии вроде как не видно.
19 авг 14, 11:57    [16461325]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Jovanny
Немного непонятна конструкция
SELECT @Result = @Result +...


Рекурсии вроде как не видно.
Новичок?
Это известная недокументированная конструкция,
которая глючит и не даёт никаких гарантий.
19 авг 14, 12:00    [16461362]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
Mustang1234567
Member

Откуда:
Сообщений: 42
Подскажите, а как правльно сделать?
19 авг 14, 12:00    [16461365]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
SELECT [FirstName] + ', ' + [LastName] 
FROM	 Person.Person p 
	join HumanResources.Employee h ON p.BusinessEntityID = h.BusinessEntityID 
	join HumanResources.EmployeeDepartmentHistory d ON h.BusinessEntityID = d.BusinessEntityID
	join HumanResources.Department b ON d.DepartmentID = b.DepartmentID 


А так что возвращает?
19 авг 14, 12:02    [16461378]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Mustang1234567
Подскажите, а как правльно сделать?


SELECT @Result = [FirstName] + ', ' + [LastName] ... 
19 авг 14, 12:03    [16461389]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
Mustang1234567
Member

Откуда:
Сообщений: 42
А так, выводит только по одному человеку для каждого отдела.
19 авг 14, 12:04    [16461394]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
Glory
Member

Откуда:
Сообщений: 104751
Mustang1234567
А так, выводит только по одному человеку для каждого отдела.

вопрос был не про количество, а про "все сотрудники выводятся нормально ( Имя + Фамилия )" ?
19 авг 14, 12:07    [16461429]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
Mustang1234567
Member

Откуда:
Сообщений: 42
Да, в таком варианте выводится один сотрудник для каждого отедла (Имя + Фамилия)
19 авг 14, 12:09    [16461446]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Mustang1234567
А так, выводит только по одному человеку для каждого отдела.

Ну ёлы-палы!!!!
Ну добавьте уж
WHERE Name = @Name

я убрал для наглядности...
19 авг 14, 12:10    [16461451]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
Mustang1234567
Member

Откуда:
Сообщений: 42
Я не убирал. Это строчка, когда её нету, выводит тупо ковычки. А когда она есть выводит по одному сотруднику.
19 авг 14, 12:11    [16461462]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
Mustang1234567
Member

Откуда:
Сообщений: 42


К сообщению приложен файл. Размер - 53Kb
19 авг 14, 12:13    [16461470]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
А если так?
WITH CTE AS
(
 SELECT p.*
 FROM Person.Person p
 JOIN HumanResources.Employee h ON p.BusinessEntityID = h.BusinessEntityID 
 JOIN HumanResources.EmployeeDepartmentHistory d ON h.BusinessEntityID = d.BusinessEntityID
 JOIN HumanResources.Department b ON d.DepartmentID = b.DepartmentID 
)
SELECT CTE.Name,
(
 SELECT '('+ISNULL(CTE1.[FirstName]+', ','') + CTE1.LastName+')'
 FROM CTE CTE1
 WHERE CTE1.Name = CTE.Name
 FOR XML PATH(''),TYPE
).value('.','varchar(1000)')
FROM CTE
GROUP BY CTE.Name;
19 авг 14, 12:14    [16461485]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Mustang1234567, а что в скриншоте не так?
Что-то не догоняю... Нужен список всех сотрудников отдела, а не одного?
19 авг 14, 12:17    [16461509]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
Mustang1234567
Member

Откуда:
Сообщений: 42
Да. Вот смотрите, если я добовлю @Result.

К сообщению приложен файл. Размер - 74Kb
19 авг 14, 12:20    [16461532]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
Glory
Member

Откуда:
Сообщений: 104751
Mustang1234567
Картинка с другого сайта.

На скриншоте у всех записей есть [FirstName] + ', ' + LastName)
19 авг 14, 12:20    [16461535]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
Mustang1234567
Member

Откуда:
Сообщений: 42
Это правильно, но у первого челвоека выводится только имя. Без фамилии
19 авг 14, 12:21    [16461540]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
Mustang1234567
Member

Откуда:
Сообщений: 42
Их много в каждом отеделе. А не один.
19 авг 14, 12:21    [16461552]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
Mustang1234567
Member

Откуда:
Сообщений: 42
iap, В ващем варанте, не видит "Name"
19 авг 14, 12:26    [16461599]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
Mustang1234567
Member

Откуда:
Сообщений: 42
iap, Спасибо. Немного исправил и всё заработало. Но мне нужно с помощью функции.
19 авг 14, 12:28    [16461623]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Mustang1234567
Это правильно, но у первого челвоека выводится только имя. Без фамилии

У последнего тоже.
19 авг 14, 12:31    [16461645]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
Mustang1234567
Member

Откуда:
Сообщений: 42
Да, не заметил. Ещё и у последнего(
19 авг 14, 12:32    [16461653]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Mustang1234567
iap, Спасибо. Немного исправил и всё заработало. Но мне нужно с помощью функции.
Я вам написал тело табличной инлайн-функции.
Это намного лучше вашего скалярного тормоза!
19 авг 14, 12:32    [16461658]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
SQL2008
Member

Откуда: Москва
Сообщений: 4478
Mustang1234567
iap, Спасибо. Немного исправил и всё заработало. Но мне нужно с помощью функции.


Посмотрите тут
19 авг 14, 12:33    [16461669]     Ответить | Цитировать Сообщить модератору
 Re: Помогите исправить функцию  [new]
invm
Member

Откуда: Москва
Сообщений: 9824
Mustang1234567
у первого челвоека выводится только имя. Без фамилии
Все там выводится, только кашей. Потому что написано так. Исправьте на:
SET @Result = null
SELECT @Result = isnull(@Result + ', ', '') + ([FirstName] + ' ' + LastName)
Убедитесь, что работает, а потом перепешите на XML.
19 авг 14, 12:34    [16461674]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить