У меня есть столбец с типом ntext
, и я хотел бы преобразовать его в список int.Столбец называется ValidForCustomers
и содержит идентификаторы клиентов, разделенные запятой.
Я знаю, что могу привести его к nvarchar(max)
, но когда я делаю это, SQL выдает ошибку
Неверный синтаксис рядом с'.'.
Часть запроса
select Items from Split(c.ValidForCustomers, ',')
Это запрос
select top 100
*,c.CouponCode,
c.Description,
case when c.CouponType = 0 then 'Order - this coupon ONLY applies to the order subtotal'
else 'Product - this coupon ONLY applies to the specified product(s)' end as CouponType,
case when c.DiscountIncludesFreeShipping = 0 then 'No' else 'Yes' end as FreeShiping,
case when c.ExpiresAfterOneUsageByEachCustomer = 0 then 'No' else 'Yes' end as 'ExpiresAfterOneUsageByAnyCustomer',
case when c.ExpiresOnFirstUseByAnyCustomer = 0 then 'No' else 'Yes' end as 'ExpiresOnFirstUseByAnyCustomer',
c.ExpiresAfterNUses,
case when len(CAST(c.ValidForCustomers as nvarchar(max))) = 0 THEN 'No'
ELSE cstms.CustomerNames END as 'ValidForCustomers',
CASE when LEN(CAST(c.ValidForProducts as nvarchar(max))) = 0 THEN 'No' ELSE 'No' END as 'ValidForProducts',
CASE when LEN(CAST(c.ValidForCategories as nvarchar(max))) = 0 THEN 'No' ELSE 'Yes' END as 'ValidForCategories'
from Coupon c with(nolock)
cross apply ( select CustomerNames = (SELECT SUBSTRING((SELECT ',' + cust.FirstName + ' ' + cust.LastName
FROM Customer cust
inner join (select IntegerFromList from dbo.fn_StringListToIntList(CAST(c.ValidFOrCustomers as nvarchar(max)), ',')) sp on (sp.IntegerFromList= cust.CustomerID)
ORDER BY cust.FirstName
FOR XML PATH('')),2,200000))) as cstms
Это процедура преобразования
CREATE FUNCTION [dbo].[fn_StringListToIntList]
(
@IntegerList NVARCHAR(MAX),
@Delimiter CHAR(1) = '|'
)
RETURNS @IntegersTable TABLE (IntegerFromList INT)
AS
BEGIN
IF (@IntegerList IS NULL) OR (LEN(@IntegerList) = 0) OR (@Delimiter IS NULL) RETURN
DECLARE @DelimPos INT
SELECT @DelimPos = PATINDEX('%' + @Delimiter + '%', @IntegerList)
WHILE @DelimPos <> 0
BEGIN
--If nothing between delims, save as NULL
IF LEN(SUBSTRING(@IntegerList, 1, @DelimPos - 1)) = 0
INSERT INTO @IntegersTable(IntegerFromList) VALUES(NULL)
ELSE
INSERT INTO @IntegersTable(IntegerFromList)
VALUES(CONVERT(INT, SUBSTRING(@IntegerList, 1, @DelimPos - 1)))
SELECT @IntegerList = SUBSTRING(@IntegerList, @DelimPos + 1, LEN(@IntegerList))
SELECT @DelimPos = PATINDEX('%' + @Delimiter + '%', @IntegerList)
END --While...
--If no additional chars after a final delim, treat as an additional NULL
IF LEN(@IntegerList) = 0
INSERT INTO @IntegersTable(IntegerFromList) VALUES(NULL)
ELSE
INSERT INTO @IntegersTable(IntegerFromList) VALUES(CONVERT(INT, @IntegerList))
RETURN
END --Function
и ошибка
Msg 102, Level 15, State 1, Line 17
Incorrect syntax near '('.
и все в порядке с синтаксисом