Мне нужно получить список, разделенный запятыми, с кавычками, и я почти в этом месте, но я получаю список с запятыми, но с пробелом в начале, но между первой кавычкой и строкой.
select stuff((select distinct ','+''''+str(bid)+'''' from dbo.Companies
where IdCompany in (select substring(ID_COMPANY,1,LEN(ID_COMPANY)-2) from
sql.Companies where SEGMENT = @Segment and STATE = 'ACTIVE')
FOR XML PATH('')) , 1 , 1 , '' )
Я получаю что-то вроде этого:
' 500004600',' 500005200',' 500009600',' 500021500'
Как удалить левое пространство, чтобы я просто получил:
'500004600','500005200','500009600','500021500'
Почему вы используете str(bid)
? Каков тип данных bid
? Вы пробовали LTRIM(bid)
вместо этого? Кроме того, если это целые числа, QUOTENAME(LTRIM(bid), char(39))
намного аккуратнее и проще для глаз и мозга, чем '+'''''
… подсчет одинарных кавычек действительно отстой.
Задавая вопрос, вам необходимо предоставить минимальный воспроизводимый пример: (1) DDL и набор выборочных данных, т. е. таблицы CREATE плюс операторы INSERT T-SQL. (2) Что вам нужно сделать, т. е. логика и ваш код попытаются реализовать ее в T-SQL. (3) Желаемый результат, основанный на примерных данных в # 1 выше. (4) Ваша версия SQL Server (SELECT @@version;).
Кроме того, если вы используете SQL Server 2017 или более позднюю версию (всегда полезно указать на самом деле), откажитесь от FOR XML PATH и STUFF в пользу STRING_AGG. См. sqlperformance.com/2022/02/t-sql-queries/…
Какая у вас версия SQL Server? select @@version
Это SQL Server 2008
Ицхак, это просто колонка с кодами. Нет необходимости в дополнительных объяснениях. Любой, кто имел дело с функциейstuff, знает, что происходит.
Это задокументировано в функции STR()
length
Is the total length. This includes decimal point, sign, digits, and spaces. The default is 10.
Вы не указали значение, поэтому оно равно 10.
Вместо этого вы должны CAST
номер varchar
. Более простой вариант, когда у вас все равно есть конкатенация, — использовать CONCAT
, который также приведет ее.
You should also remove the
DISTINCT
and useGROUP BY bid
, otherwise indexes and other optimizations cannot be used (because of the concatenation).
SELECT STUFF((
SELECT CONCAT(',''', c.bid, '''')
FROM dbo.Companies c
WHERE c.IdCompany in (
SELECT SUBSTRING(c2.ID_COMPANY, 1, LEN(c2.ID_COMPANY) - 2)
FROM sql.Companies c2
WHERE c2.SEGMENT = @Segment
AND c2.STATE = 'ACTIVE'
)
GROUP BY
c.bid
FOR XML PATH('')
) , 1 , LEN(',') , '' )
В качестве побочного пункта, если вы объединяете строки, которые могут иметь проблемы с экранированием XML, вам понадобится
FOR XML PATH(''), TYPE
).value('text()[1]','varchar(max)') , 1 , LEN(',') , '' )
Очевидно, что в более новых версиях SQL Server вы можете просто использовать STRING_AGG
SELECT STRING_AGG(CONCAT('''', c.bid, ''''), ',')
FROM dbo.Companies c
WHERE c.IdCompany in (
SELECT SUBSTRING(c2.ID_COMPANY, 1, LEN(c2.ID_COMPANY) - 2)
FROM sql.Companies c2
WHERE c2.SEGMENT = @Segment
AND c2.STATE = 'ACTIVE'
)
GROUP BY
c.bid
DDL и демонстрационные данные значительно упростили бы эту задачу. Есть ли в ваших данных начальный пробел?