t-sql как это работает?SELECT @MyList = ISNULL (@MyList, '') + Title + ',' FROM Titles - PullRequest
4 голосов
/ 19 октября 2011

Я натолкнулся на очень крутой t-sql для создания списка значений столбцов через запятую из выбранных строк в одном запросе t-sql:

SELECT @MyList = ISNULL(@MyList,'')  + Title + ', ' FROM Titles

Но я не могу понять, как это работает. Почему-то это должен быть рекурсивный вызов, но я не знаю как. Может кто-нибудь объяснить мне или отправить ссылку, которая объясняет это? Чтобы увидеть, как это работает, используйте следующий скрипт:

CREATE TABLE  Titles(
    Title varchar(50)  
    )

    insert Titles  values ( 'Doctor')
    insert Titles   values ( 'Nurse')
    insert Titles   values ( 'Administrator')
    insert Titles   values ( 'CMA')

    select * from Titles

    DECLARE @MyList VARCHAR(1000)
    SET @MyList = ''
    SELECT @MyList = ISNULL(@MyList,'')  + Title + ', ' FROM Titles
    SELECT @MyList

Ответы [ 3 ]

3 голосов
/ 19 октября 2011

Назначение:

@MyList = ISNULL(@MyList,'')  + Title + ', ' 

оценивается для каждой строки таблицы заголовков.Он объединяет значение столбца Title каждой строки в @ MyList.

Тест ISNULL(@MyList,'') необходим только для того, чтобы @MyList начинался с пустой строки, если он NULL.В вашем примере ISNULL не требуется, поскольку @MyList явно установлен на пустую строку.

2 голосов
/ 19 октября 2011

Другие ответы объяснили, почему это создает ваш список с разделителями-запятыми.Вы заметите, что в конце вы получите дополнительную запятую, которую вы можете удалить, если хотите.Если вы используете SQL Server 2005 или более позднюю версию, вы можете использовать COALESCE и не иметь этой запятой:

SELECT @MyList = COALESCE(@MyList + ', ','') + Title FROM Titles 

Для первой строки @MyList будет NULL, поэтому @MyList + ', ' будет иметь значение NULL, а COALESCE вернет ''.По сути, обработка первой строки делает это:

SELECT @MyList = '' + Title

Для последующих строк COALESCE вернет @MyList + ', ', и вы получите эквивалент

SELECT @MyList = @MyList + ', ' + Title.

1 голос
/ 19 октября 2011

Таблица Titles содержит набор предопределенных заголовков, поэтому запрос

SELECT @MyList = ISNULL(@MyList,'')  + Title + ', ' FROM Titles 

Добавляет добавление значение столбца Заголовок для каждой строки втаблица Titles.

Это эквивалентно следующему циклу:

// Actually  ISNULL(@MyList,'') does initialize 
// @MyList by empty string whilst processing the first row in tsql query
string myList = "";
foreach(string title in Titles)
{
   myList = myList +  ', ' + title;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...