Идентификатор, который начинается с (запрос) Максимальная длина 128

Проблема: я использую 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. Используйте одинарные кавычки и удваивайте любые встроенные кавычки.

T N 13.02.2023 08:47
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хотя могут быть проблемы с вашей процедурой, эта конкретная проблема возникает из-за того, как вы ее называете. Двойные кавычки в 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''
';

Другие вопросы по теме