Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите разобраться с sp_executesql и Like  [new]
RealShumer
Member

Откуда:
Сообщений: 2
Есть созданная процедура для sql server 2012 (пример ниже) проблема в том что я незнаю как задать условие для оператора Like в строке, чтоб все работало. К примеру для поиска по полю CodeItem это поле имеет тип NVARCHAR(20) мне нужно найти к примеру все записи которые начинаются с '152' по идеи это должно выглядеть так '152%', но так как это все пишется в строку а потом исполняется в sp_executesql в которой подставляются значения переменных, то почему то не работает. Я думаю что это связано с с тем что как то не так надо записывать значения в этом случаи... Опыт по sql и sql-t не велик, помогите чем сможете...

CREATE PROCEDURE [dbo].[GetItemListProcedure]
@LangId int,
@LangNativeId Int,
@ItemGroupId Int,
@ItemCategoryId Int,
@ItemCode NVARCHAR,
@Part NVARCHAR,
@Schneider NVARCHAR,
@Trade NVARCHAR,
@OEM NVARCHAR
AS
SET NOCOUNT ON;


DECLARE @SQLQuery NVARCHAR(MAX);

IF(@LangId IS NULL) SET @LangId = 1;
IF(@LangNativeId IS NULL) SET @LangNativeId = 2;

SET @SQLQuery = N'SELECT Items.Id, Items.ItemCode, Items.GroupItemId, GroupsItems.ParentId AS GroupItemsParentId, GroupTexts.Text AS GroupTitle, Items.PinItemCode,'
+ 'Items.ItemFamilyCode, ItemFamily.Title AS FamilyTitle, Items.UserProfileId, UsersProfiles.UserName, '
+ 'Items.CreateDate, Items.ItemPosition, Items.TechnicalInformation, Items.TradeCode, Items.SchneiderCode, '
+ 'Items.PrintCode, SpecialInformationTexts.Text AS SpecialInformationText, DescriptionTextsEng.Text AS DescriptionTextEng, '
+ 'DescriptionTextNative.Text AS DescriptionTextNative, '
+ '(SELECT TOP (1) CategoryTexts.Text FROM CategoryItems INNER JOIN CategoryTexts ON CategoryItems.Id = CategoryTexts.CategoryId INNER JOIN '
+ 'CategoryItemM2MItem ON CategoryItems.Id = CategoryItemM2MItem.СategoryItem_Id WHERE (CategoryItemM2MItem.ItemId = Items.Id) AND (CategoryTexts.LangId = '
+ '@langId)) AS CategoryTitle, '
+ '(SELECT TOP (1) Supplier.Name FROM Supplier INNER JOIN SupplierM2MItem ON Supplier.Id = SupplierM2MItem.SupplierId AND SupplierM2MItem.ItemId = Items.Id) AS SupplierNames '
+ 'FROM Items LEFT OUTER JOIN '
+ 'DescriptionTexts AS DescriptionTextNative ON Items.Id = DescriptionTextNative.ItemId AND '
+ 'DescriptionTextNative.LangId = @langNativeId LEFT OUTER JOIN '
+ 'CategoryItems AS GroupsItems LEFT OUTER JOIN '
+ 'CategoryTexts AS GroupTexts ON GroupsItems.Id = GroupTexts.CategoryId AND GroupTexts.LangId = @langId'
+ ' ON Items.GroupItemId = GroupsItems.Id LEFT OUTER JOIN UsersProfiles ON Items.UserProfileId = UsersProfiles.Id LEFT OUTER JOIN '
+ 'SpecialInformationTexts ON Items.SpecialInformationId = SpecialInformationTexts.id AND SpecialInformationTexts.LangId = @langId'
+ ' LEFT OUTER JOIN ItemFamily ON Items.ItemFamilyCode = ItemFamily.Code LEFT OUTER JOIN '
+ 'DescriptionTexts AS DescriptionTextsEng ON Items.Id = DescriptionTextsEng.ItemId AND DescriptionTextsEng.LangId = @langId';


DECLARE @FirstStatement bit;
SET @FirstStatement = 1;

--Дополняем связи если надо

IF(@OEM IS NOT NULL AND LEN(@OEM) > 0)
BEGIN
SET @SQLQuery += N' INNER JOIN OEMForItemList ON Items.Id = OEMForItemList.ItemId INNER JOIN OEM ON OEMForItemList.OEMId = OEM.Id';
END

IF(@ItemCategoryId IS NOT NULL )
BEGIN
SET @SQLQuery += N' INNER JOIN CategoryItemM2MItem ON Items.Id = CategoryItemM2MItem.ItemId';
END

--Дополняем условия если надо

IF(@ItemCode IS NOT NULL AND LEN(@ItemCode) > 0)
BEGIN
IF @FirstStatement = 1
BEGIN
SET @SQLQuery += N' WHERE (Items.ItemCode LIKE ''@itemCode%'' )';
SET @FirstStatement = 0;
END
ELSE SET @SQLQuery += N' AND (Items.ItemCode LIKE ''@itemCode%'' )';
END

IF(@OEM IS NOT NULL AND LEN(@OEM) > 0)
BEGIN
IF @FirstStatement = 1
BEGIN
SET @SQLQuery += N' WHERE (OEM.OEMNumber LIKE ''@oem%'')';
SET @FirstStatement = 0;
END
ELSE SET @SQLQuery += N' AND (OEM.OEMNumber LIKE ''@oem%'')';
END



IF(@Schneider IS NOT NULL AND LEN(@Schneider) > 0)
BEGIN
IF @FirstStatement = 1
BEGIN
SET @SQLQuery += N' WHERE (Items.SchneiderCode LIKE ''@schneider%'')';
SET @FirstStatement = 0;
END
ELSE SET @SQLQuery += N' AND (Items.SchneiderCode LIKE ''@schneider%'' )';
END

IF(@Trade IS NOT NULL AND LEN(@Trade) > 0)
BEGIN
IF @FirstStatement = 1
BEGIN
SET @SQLQuery += N' WHERE (Items.TradeCode LIKE ''@trade%'' )';
SET @FirstStatement = 0;
END
ELSE SET @SQLQuery += N' AND (Items.TradeCode LIKE ''@trade%'' )';
END

IF(@ItemCategoryId IS NOT NULL)
BEGIN
IF @FirstStatement = 1
BEGIN
SET @SQLQuery += N' WHERE (CategoryItemM2MItem.СategoryItem_Id = @itemCategoryId )';
SET @FirstStatement = 0;
END
ELSE SET @SQLQuery += N' AND (CategoryItemM2MItem.СategoryItem_Id = @itemCategoryId )';
END

IF(@ItemGroupId IS NOT NULL)
BEGIN
IF @FirstStatement = 1
BEGIN
SET @SQLQuery += N' WHERE (Items.GroupItemId = @itemGroupId )';
SET @FirstStatement = 0;
END
ELSE SET @SQLQuery += N' AND (Items.GroupItemId = @itemGroupId )';
END


DECLARE @ParmDefinition NVARCHAR(600);
SET @ParmDefinition = N'@langId int, @langNativeId int, @itemGroupId Int, '
+ '@itemCategoryId Int, @itemCode NVARCHAR, @part NVARCHAR, @schneider NVARCHAR, @trade NVARCHAR, @oem NVARCHAR';
/* Execute the string with the first parameter value. */


EXEC AutoParts.sys.sp_executesql @SQLQuery, @ParmDefinition, @langId = @LangId, @langNativeId = @LangNativeId,
@itemGroupId = @ItemGroupId, @itemCategoryId = @ItemCategoryId, @itemCode = @ItemCode,
@part = @Part, @schneider = @Schneider, @trade = @Trade, @oem = @OEM

GO
30 авг 13, 10:39    [14774623]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с sp_executesql и Like  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
RealShumer
Я думаю что это связано с с тем что как то не так надо записывать значения в этом случаи
Может, это связано с тем, что у вас параметры типа NVARCHAR(1), и строки типа '152%' туда просто не помещаются?
30 авг 13, 10:41    [14774642]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с sp_executesql и Like  [new]
Гость333
Member

Откуда:
Сообщений: 3683
RealShumer,

Вот так:
SET @SQLQuery += N' WHERE (Items.SchneiderCode LIKE ''@schneider%'')';
вы не используете параметр @schneider, а проверяете, что значение SchneiderCode начинается со строки "@schneider".

Параметр надо использовать так:
SET @SQLQuery += N' WHERE (Items.SchneiderCode LIKE @schneider + ''%'')';


Ну и длину параметров исправьте, да.
30 авг 13, 10:46    [14774677]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с sp_executesql и Like  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
RealShumer
Опыт по sql и sql-t не велик, помогите чем сможете...
Ещё делюсь опытом - перед EXEC AutoParts.sys.sp_executesql поставте PRINT @SQLQuery
30 авг 13, 10:50    [14774702]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с sp_executesql и Like  [new]
RealShumer
Member

Откуда:
Сообщений: 2
Всем спасибо, вы все оказались правы.
Можно еще вопрос, возможно ли перенести данную процедуру в функцию? Насколько я понимаю функции более просты и такого не допускают, я не прав?
30 авг 13, 11:25    [14774986]     Ответить | Цитировать Сообщить модератору
 Re: Помогите разобраться с sp_executesql и Like  [new]
Гость333
Member

Откуда:
Сообщений: 3683
RealShumer,

Вы правы, например, внутри функции нельзя использовать динамический SQL.
30 авг 13, 11:37    [14775091]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить