Как объединить текст из нескольких строк в одну текстовую строку на сервере SQL?

Попробуйте getTimezone и setTimezone , см. пример

(Но это использует класс)

UPDATE:

Без каких-либо классов вы можете попробовать что-то вроде этого:

$the_date = strtotime("2010-01-19 00:00:00");
echo(date_default_timezone_get() . "
"); echo(date("Y-d-mTG:i:sz",$the_date) . "
"); echo(date_default_timezone_set("UTC") . "
"); echo(date("Y-d-mTG:i:sz", $the_date) . "
");

ПРИМЕЧАНИЕ. Возможно, вам потребуется также установить часовой пояс на оригинал

1741
задан Steve Chambers 19 February 2018 в 20:41
поделиться

9 ответов

Если Вы находитесь на SQL Server 2017 или Azure, см. ответ Mathieu Renda .

у меня была подобная проблема, когда я пытался присоединиться к двум таблицам со связями "один ко многим". В SQL 2005 я нашел, что XML PATH метод может обработать конкатенацию строк очень легко.

, Если существует таблица, названная STUDENTS

SubjectID       StudentName
----------      -------------
1               Mary
1               John
1               Sam
2               Alaina
2               Edward

Результат, я ожидал, был:

SubjectID       StudentName
----------      -------------
1               Mary, John, Sam
2               Alaina, Edward

я использовал следующий T-SQL:

SELECT Main.SubjectID,
       LEFT(Main.Students,Len(Main.Students)-1) As "Students"
FROM
    (
        SELECT DISTINCT ST2.SubjectID, 
            (
                SELECT ST1.StudentName + ',' AS [text()]
                FROM dbo.Students ST1
                WHERE ST1.SubjectID = ST2.SubjectID
                ORDER BY ST1.SubjectID
                FOR XML PATH ('')
            ) [Students]
        FROM dbo.Students ST2
    ) [Main]

можно сделать то же самое более компактным способом, если Вы можете concat запятые вначале и использование substring для пропуска первого, таким образом, Вы не должны делать подзапроса:

SELECT DISTINCT ST2.SubjectID, 
    SUBSTRING(
        (
            SELECT ','+ST1.StudentName  AS [text()]
            FROM dbo.Students ST1
            WHERE ST1.SubjectID = ST2.SubjectID
            ORDER BY ST1.SubjectID
            FOR XML PATH ('')
        ), 2, 1000) [Students]
FROM dbo.Students ST2
1332
ответ дан StefanJCollier 20 February 2018 в 06:41
поделиться
  • 1
    Или учитывая переменных (a, b или учитывая c) мог Вы демонстрировать it' s использование? Единственный путь I видит, что это работать является новый Массив ().IsNullOrEmpty (a); – maxp 19 December 2011 в 10:54

Одним путем Вы могли сделать это в SQL  Сервер должен был бы возвратить содержание таблицы как XML (для сырых данных XML), преобразовать результат в строку и затем заменить теги", ".

2
ответ дан Peter Mortensen 19 February 2018 в 20:41
поделиться

Зависит от Вашего поставщика базы данных. MySQL имеет concat_ws. SQL Server MS ожидает, что Вы сделаете это в своем клиентском приложении.

Обновление: Вы могли также сделать это во внешней процедуре или UDF, возможно, при помощи курсора или обращающегося кода CLR.

-4
ответ дан Joel Coehoorn 19 February 2018 в 20:41
поделиться

В MySQL существует функция, GROUP_CONCAT () , который позволяет Вам связывать значения от нескольких строк. Пример:

SELECT 1 AS a, GROUP_CONCAT(name ORDER BY name ASC SEPARATOR ', ') AS people 
FROM users 
WHERE id IN (1,2,3) 
GROUP BY a
112
ответ дан Peter Mortensen 19 February 2018 в 20:41
поделиться

Этот ответ может возвратиться неожиданные результаты Для последовательных результатов, использовать один из ДЛЯ методов ПУТИ XML, подробно изложенных в других ответах.

Использование COALESCE:

DECLARE @Names VARCHAR(8000) 
SELECT @Names = COALESCE(@Names + ', ', '') + Name 
FROM People

Просто некоторое объяснение (так как этот ответ, кажется, получает относительно регулярные представления):

  • Объединяют, действительно просто полезный обман, который выполняет две вещи:

1) Никакая потребность инициализировать @Names со значением пустой строки.

2) Никакая потребность снять изоляцию с дополнительного разделителя в конце.

  • решение выше даст неправильные результаты, если строка будет иметь ПУСТОЙ УКАЗАТЕЛЬ значение Имени (если будет ПУСТОЙ УКАЗАТЕЛЬ , , то ПУСТОЙ УКАЗАТЕЛЬ сделает @Names ПУСТОЙ УКАЗАТЕЛЬ после той строки, и следующая строка запустится по как пустая строка снова. Легко зафиксированный с одним из двух решений:
DECLARE @Names VARCHAR(8000) 
SELECT @Names = COALESCE(@Names + ', ', '') + Name
FROM People
WHERE Name IS NOT NULL

или:

DECLARE @Names VARCHAR(8000) 
SELECT @Names = COALESCE(@Names + ', ', '') + 
    ISNULL(Name, 'N/A')
FROM People

В зависимости от того, какое поведение Вы хотите (право преимущественной покупки просто фильтрует ПУСТОЙ УКАЗАТЕЛЬ с, вторая опция сохраняет их в списке с сообщением маркера [заменяют and/A' тем, что подходит для Вас]).

958
ответ дан Martin Smith 19 February 2018 в 20:41
поделиться

У меня нет доступа к SQL Server дома, таким образом, я, предполагают синтаксис здесь, но это более или менее:

DECLARE @names VARCHAR(500)

SELECT @names = @names + ' ' + Name
FROM Names
26
ответ дан Dana 19 February 2018 в 20:41
поделиться
DECLARE @Names VARCHAR(8000)
SELECT @name = ''
SELECT @Names = @Names + ',' + Names FROM People
SELECT SUBSTRING(2, @Names, 7998)

Это помещает случайную запятую вначале.

Однако при необходимости в других столбцах, или к CSV дочерняя таблица необходимо обернуть это в скалярное определяемое пользователем поле (UDF).

можно использовать путь XML в качестве связанного подзапроса в ИЗБРАННОМ пункте также (но я должен был бы ожидать, пока я не возвращаюсь к работе, потому что Google не делает материала работы дома:-)

10
ответ дан Peter Mortensen 19 February 2018 в 20:41
поделиться

сверху ответа Chris Shaffer

, если Ваши данные могут быть повторены Такой как

Tom
Ali
John
Ali
Tom
Mike

Вместо того, чтобы иметь Tom,Ali,John,Ali,Tom,Mike

, можно использовать ОТЛИЧНЫЙ, чтобы избежать дубликатов и добраться Tom,Ali,John,Mike

DECLARE @Names VARCHAR(8000) 
SELECT DISTINCT @Names = COALESCE(@Names + ',', '') + Name
FROM People
WHERE Name IS NOT NULL
SELECT @Names
1
ответ дан 22 November 2019 в 20:06
поделиться

Это работало на меня:

SELECT CarNamesString = STUFF((
         SELECT ',' + [Name]
            FROM tbl_cars 
            FOR XML PATH('')
         ), 1, 1, '')

Вот источник: https://www.mytecbits.com /

3
ответ дан 22 November 2019 в 20:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: