Проблема: я использую sp на сервере sql, где я взял параметр, который изменяет запрос, а затем запускает полный запрос на сервере. Пока я передаю этот параметр в sp, он говорит: «Идентификатор, начинающийся с «WHERE d.LastModified<1676270281779 AND (p.ProductName LIKE '%2004%» ИЛИ p.ProductBarcode LIKE '%2004%') AND d. SupplierId='SUP-001' слишком длинный. Максимальная длина 128".
ЗАПРОС:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[get_SupComProducts] @whereClause NVARCHAR(max)
AS
BEGIN
DECLARE @query NVARCHAR(max)
, @status VARCHAR(25);
SET @status = 'IN'
SET @query = 'SELECT DISTINCT
p.ProductId,
p.CompanyId,
p.ProductName,
p.ProductGrossWeight,
p.ProductNetWeight,
p.ProductUnit,
p.CategoryId,
p.BrandId,
p.ProductBarcode,
p.MinShelfLife,
p.ProductMargin,
p.IsWeighted,
p.PVAT,
p.ProductMargin,
p.AFSProduct,
ISNULL(sp.ProductBarcode, 0) AS Barcode,
ISNULL(sp.CostPrice, 0) AS CostPrice,
ISNULL(sp.TradePrice, 0) AS TradePrice,
ISNULL(sp.MRP, 0) AS MRP,
ISNULL(sp.SellingPrice, 0) AS SellingPrice,
ISNULL(sp.VAT, 0) AS VAT,
ISNULL((
SELECT SUM(ProductQty) AS ProductQty
FROM StockDetails
WHERE ProductId = p.ProductId AND [Status]= ''' + @status + '''' +
'),0) AS CurrentStock
FROM Supplier d
JOIN Product p
ON p.CompanyId = d.CompanyId
LEFT JOIN StockDetails sd
ON sd.ProductId = p.ProductId
LEFT JOIN SupplierProduct sp
ON sp.ProductId = p.ProductId ' + @whereClause
EXEC (@query)
END
GO
Пожалуйста, если есть какое-то решение, которое вы, ребята, уже знаете, это будет очень заметно. Заранее спасибо.
СП ИСПОЛНИТЕЛЬ:
EXEC [dbo].[get_SupComProducts] @whereClause = "WHERE d.LastModified<1676270281779 AND (p.ProductName LIKE '%2004%' OR p.ProductBarcode LIKE '%2004%') AND d.SupplierId='SUP-00123'"
Если я удалю любой запрос AND, он сработает, но полный запрос говорит об ошибке.
Сообщение 103, уровень 15, состояние 4, строка 1 Идентификатор, начинающийся с «WHERE d.LastModified<1676270281779 AND (p.ProductName LIKE '%2004%» OR p.ProductBarcode LIKE '%2004%') AND d.SupplierId='SUP-001', слишком длинный. Максимальная длина 128.
Хотя могут быть проблемы с вашей процедурой, эта конкретная проблема возникает из-за того, как вы ее называете. Двойные кавычки в SQL по умолчанию обозначают имена объектов, а в MS SQL Server максимальная длина любого имени объекта составляет 128 символов. Вот где вы получаете эту ошибку, я подозреваю.
Итак, в вашем вызове sp вам нужно заменить двойные кавычки одинарными и соответствующим образом экранировать все одинарные кавычки внутри него. Что-то вроде этого:
EXEC [dbo].[get_SupComProducts] @whereClause = '
WHERE
d.LastModified<1676270281779 AND (
p.ProductName LIKE ''%2004%''
OR p.ProductBarcode LIKE ''%2004%''
) AND d.SupplierId=''SUP-00123''
';
Вы не можете использовать двойные кавычки для строк на сервере SQL. Используйте одинарные кавычки и удваивайте любые встроенные кавычки.