PDA

View Full Version : مشکل در sp کسی میدونه اشکالش چیه؟!



tazarvmmr
یک شنبه 13 دی 1394, 17:18 عصر
سلام به همگی
این sp یک مشکل داره که من نمیتونم پیداش کنم! سه تا جدول داریم یکی جدول لغات به نام WordsDictionary یکی هم جدول ایندکس لغات در نامه ها بنام LettersDictionary یکی هم جدول نامه ها بنام Letters ساختار هر کدوم به این شکله:
جدول اول:

ID bigint Unchecked
Word nvarchar(50) Checked


جدول دوم:

Id bigint Unchecked
WordId bigint Checked
LetterId int Checked
LetterType int Checked
WordQTY int Checked


جدول سوم:

ID int Unchecked
DescriptionId int Checked
LevelCode int Checked
UserCode int Checked
SectionCode int Checked
CustomerCode int Checked
OfficeCode int Checked
ProjectCode int Checked
FilePath nvarchar(500) Checked
DateOfDefine nvarchar(10) Checked
Number nvarchar(100) Checked
TypeCode int Checked
Direction int Checked
SubjectCode int Checked
PriorityCode int Checked
Deleted bit Checked
DeleteDate nvarchar(10) Checked
DelUserCode int Checked
LES tinyint Checked
LET smalldatetime Checked
Archived bit Checked
ArchivedUserCode int Checked
ArchivedDate nvarchar(10) Checked
IssueDate nvarchar(10) Checked
IssueTime nvarchar(5) Checked
ReferTo nvarchar(100) Checked
HTMLBody nvarchar(MAX) Checked
RNumber nvarchar(100) Checked
Tags ntext Checked
Analysed bit Checked
FirstDestUser int Checked
FirstDestSection int Checked
FirstDestOffice int Checked
FirstParaphTextId int Checked


من باید با یک sp که 10 تا پارامتر ورودی داره و هر کدوم یک لغت هست لیست تمام Letter هایی که این لغات درشون بکار برده شده رو برگردونم، یعنی Letter هایی که همه لغات رو دارا هستن، حالا امکان داره از این 10 پارامتر ورودی فقط یکیش مقدار داشته باشه و یا همش مقدار داشته باشه پس من باید تمام لغاتی که به sp پاس شده که میتونه از یک تا 10 تا باشه بگیرم و بر اساس هر چندتاش که مقدار داره تمام نامه هایی که تمام اون لغات درشون وجود داره رو برگردونم.

جدول Letters مشخصات نامه هارو نگه میداره، جدول WordsDictionary تمام لغات موجود در دیکشنری ماست که هر لغت فقط یکبار درش ذخیره شده و جدول LettersDictionary به ما میگه هر لغت در چه نامه هایی وجود داره.
sp که من نوشتم به شکل زیر هستش:

ALTER procedure [dbo].[sp_SearchWordDictionary]
@Word01 nvarchar(50) = '',
@Word02 nvarchar(50) = '',
@Word03 nvarchar(50) = '',
@Word04 nvarchar(50) = '',
@Word05 nvarchar(50) = '',
@Word06 nvarchar(50) = '',
@Word07 nvarchar(50) = '',
@Word08 nvarchar(50) = '',
@Word09 nvarchar(50) = '',
@Word10 nvarchar(50) = '',
@Word11 nvarchar(50) = '',
@Word12 nvarchar(50) = '',
@Word13 nvarchar(50) = '',
@Word14 nvarchar(50) = '',
@Word15 nvarchar(50) = '',
@Word16 nvarchar(50) = '',
@Word17 nvarchar(50) = '',
@Word18 nvarchar(50) = '',
@Word19 nvarchar(50) = '',
@Word20 nvarchar(50) = '',
@UserLetterLevel int


as

Declare @LetterWords01 table (LetterId int, WordId int);
Declare @LetterWords02 table (LetterId int, WordId int);
Declare @LetterWords03 table (LetterId int, WordId int);
Declare @LetterWords04 table (LetterId int, WordId int);
Declare @LetterWords05 table (LetterId int, WordId int);
Declare @LetterWords06 table (LetterId int, WordId int);
Declare @LetterWords07 table (LetterId int, WordId int);
Declare @LetterWords08 table (LetterId int, WordId int);
Declare @LetterWords09 table (LetterId int, WordId int);
Declare @LetterWords10 table (LetterId int, WordId int);


Insert into @LetterWords01
SELECT LettersDictionary.LetterId,
LettersDictionary.WordId
FROM WordDictionary RIGHT OUTER JOIN
LettersDictionary ON WordDictionary.ID = LettersDictionary.WordId
Where (WordDictionary.Word Like N'%' + @Word01 + '%')

Insert into @LetterWords02
SELECT LettersDictionary.LetterId,
LettersDictionary.WordId
FROM WordDictionary RIGHT OUTER JOIN
LettersDictionary ON WordDictionary.ID = LettersDictionary.WordId
Where (WordDictionary.Word Like N'%' + @Word02 + '%')

Insert into @LetterWords03
SELECT LettersDictionary.LetterId,
LettersDictionary.WordId
FROM WordDictionary RIGHT OUTER JOIN
LettersDictionary ON WordDictionary.ID = LettersDictionary.WordId
Where (WordDictionary.Word Like N'%' + @Word03 + '%')


Insert into @LetterWords04
SELECT LettersDictionary.LetterId,
LettersDictionary.WordId
FROM WordDictionary RIGHT OUTER JOIN
LettersDictionary ON WordDictionary.ID = LettersDictionary.WordId
Where (WordDictionary.Word Like N'%' + @Word04 + '%')

Insert into @LetterWords05
SELECT LettersDictionary.LetterId,
LettersDictionary.WordId
FROM WordDictionary RIGHT OUTER JOIN
LettersDictionary ON WordDictionary.ID = LettersDictionary.WordId
Where (WordDictionary.Word Like N'%' + @Word05 + '%')

Insert into @LetterWords06
SELECT LettersDictionary.LetterId,
LettersDictionary.WordId
FROM WordDictionary RIGHT OUTER JOIN
LettersDictionary ON WordDictionary.ID = LettersDictionary.WordId
Where (WordDictionary.Word Like N'%' + @Word06 + '%')

Insert into @LetterWords07
SELECT LettersDictionary.LetterId,
LettersDictionary.WordId
FROM WordDictionary RIGHT OUTER JOIN
LettersDictionary ON WordDictionary.ID = LettersDictionary.WordId
Where (WordDictionary.Word Like N'%' + @Word07 + '%')

Insert into @LetterWords08
SELECT LettersDictionary.LetterId,
LettersDictionary.WordId
FROM WordDictionary RIGHT OUTER JOIN
LettersDictionary ON WordDictionary.ID = LettersDictionary.WordId
Where (WordDictionary.Word Like N'%' + @Word08 + '%')

Insert into @LetterWords09
SELECT LettersDictionary.LetterId,
LettersDictionary.WordId
FROM WordDictionary RIGHT OUTER JOIN
LettersDictionary ON WordDictionary.ID = LettersDictionary.WordId
Where (WordDictionary.Word Like N'%' + @Word09 + '%')


Insert into @LetterWords10
SELECT LettersDictionary.LetterId,
LettersDictionary.WordId
FROM WordDictionary RIGHT OUTER JOIN
LettersDictionary ON WordDictionary.ID = LettersDictionary.WordId
Where (WordDictionary.Word Like N'%' + @Word10 + '%')

SELECT
Letters.PriorityCode AS PeriorityId,
Letters.DateOfDefine AS LetterDate,
Letters.TypeCode AS LetterTypeId,
Letters.ID AS LetterId,
Descriptions.DescriptionCaption,
Letters.LevelCode,
Letters.Number,
Letters.Direction,
ISNULL(LetterSubjects.LetterSubjects, '') AS LetterSubjects,
Letters.Archived,
Letters.ReferTo,
Letters.CustomerCode,
Letters.OfficeCode,
Letters.ProjectCode,
ISNULL(RequestedProjects.RequestProjectName, '') AS LetterProjectName,
ISNULL(CustomersPfix.CustomerPfixCaption, '') + N' ' + ISNULL(Customers.CustomerName, '') AS LetterCustomerName,
ISNULL(OfficesPfix.CustomerPfixCaption, '') + N' ' + ISNULL(Offices.OfficeName, '') AS LetterOfficeName,
Case When Letters.Direction <> 2 Then '-'
Else ISNULL(Customers.CustomerName, '') + ' - ' + ISNULL(Offices.OfficeName, '') + ' - ' + ISNULL(RequestedProjects.RequestProjectName, '')
End AS LetterDest,
Sexes.ShortCaption + N' ' + Users.UserName AS UserName,
Sections.Name AS SectionName,
OurOffices.OurOfficeName

FROM
LetterSubjects RIGHT OUTER JOIN
CustomersPfix AS OfficesPfix RIGHT OUTER JOIN
Offices ON OfficesPfix.Id = Offices.OfficeSexId RIGHT OUTER JOIN
Users LEFT OUTER JOIN
Sexes ON Users.UserSexId = Sexes.SexId RIGHT OUTER JOIN
Letters ON Users.Id = Letters.UserCode LEFT OUTER JOIN
Sections LEFT OUTER JOIN
OurOffices ON Sections.OurOfficeId = OurOffices.Id ON Letters.SectionCode = Sections.Id LEFT OUTER JOIN
RequestedProjects RIGHT OUTER JOIN
ProjectNames ON RequestedProjects.Id = ProjectNames.RequestId ON Letters.PriorityCode = ProjectNames.Id LEFT OUTER JOIN
CustomersPfix RIGHT OUTER JOIN
Customers ON CustomersPfix.Id = Customers.CustomerNameSuffixId ON Letters.CustomerCode = Customers.Id ON Offices.Id = Letters.OfficeCode ON
LetterSubjects.ID = Letters.SubjectCode LEFT OUTER JOIN
Descriptions ON Letters.DescriptionId = Descriptions.Id

Where
(Letters.LevelCode <= @UserLetterLevel) And
(
(Case When EXISTS (SELECT 1 FROM @LetterWords01) Then Letters.Id End In (Select LetterId From @LetterWords01))
) And
(
(Case When EXISTS (SELECT 1 FROM @LetterWords02) Then Letters.Id End In (Select LetterId From @LetterWords02))
) And
(
(Case When EXISTS (SELECT 1 FROM @LetterWords03) Then Letters.Id End In (Select LetterId From @LetterWords03))
) And
(
(Case When EXISTS (SELECT 1 FROM @LetterWords04) Then Letters.Id End In (Select LetterId From @LetterWords04))
) And
(
(Case When EXISTS (SELECT 1 FROM @LetterWords05) Then Letters.Id End In (Select LetterId From @LetterWords05))
) And
(
(Case When EXISTS (SELECT 1 FROM @LetterWords06) Then Letters.Id End In (Select LetterId From @LetterWords06))
) And
(
(Case When EXISTS (SELECT 1 FROM @LetterWords07) Then Letters.Id End In (Select LetterId From @LetterWords07))
) And
(
(Case When EXISTS (SELECT 1 FROM @LetterWords08) Then Letters.Id End In (Select LetterId From @LetterWords08))
) And
(
(Case When EXISTS (SELECT 1 FROM @LetterWords09) Then Letters.Id End In (Select LetterId From @LetterWords09))
) And
(
(Case When EXISTS (SELECT 1 FROM @LetterWords10) Then Letters.Id End In (Select LetterId From @LetterWords10))
)




خوب یک سری جدولهای دیگری هم درگیر این sp هستند که خیلی مهم نیست چی هستن، حالا این sp وقتی از ده تا کلمه ای که بهش پاس میشه تا 3 تاش مقدار داشته باشه و 7 تا باقیش خالی باشه درست کار میکنه! ولی وقتی بیشتر از 3 تا پارامتر بهش پاس میشه دیگه همیشه خروجیش خالیه!!!!

در این sp در حقیقت من 10 تا متغیر از نوع table در نظر گرفتم که دو تا فیلد دارن از تلفیق جدول WordsDictionary و LettersDictionary همه 10 تا لغتهایی که به sp پاس شده از WordDictionary کدشونو میگیرم و از LettersDictionary تمام نامه هایی که اون لغت درشون وجود داره میریزم توی این متغیرها، یعنی متغیر LettersWord01 در حقیقت میشه اندیکس تمام نامه هایی که کلمه Word01 درش وجود داره. در مورد هر ده تا پارامتر این کار رو انجام میدم،
در آخر هم یک Query میگیرم که تمام نامه هایی که در همه این جداول مجازی کدشون وجود داره رو برای من نمایش بده!


حالا:
1- مطمعنم راهی که برای انجام این کار پیدا کردم جزو مسخره ترین راه هاست! کسی میتونه راه بهتری پیشنهاد کنه؟
2- مغز من دیگه جواب نمیده که چرا این sp با سه تا کلمه درست کار میکنه و یشتر از سه تا غلط! کسی میتونه اشکالشو بفهمه؟
3- ممنون از همه

tazarvmmr
یک شنبه 13 دی 1394, 22:10 عصر
به نظرم مشکل از این قسمت باشه نمیتونه کلمه داده شده رو پیدا کنه!!!!


Insert into @LetterWords01
SELECT LettersDictionary.LetterId,
LettersDictionary.WordId
FROM WordDictionary RIGHT OUTER JOIN
LettersDictionary ON WordDictionary.ID = LettersDictionary.WordId
Where (WordDictionary.Word Like N'%' + @Word01 + '%')


و جدول رو خالی برمیگردونه!!!

tazarvmmr
یک شنبه 13 دی 1394, 23:51 عصر
خوب مشکل اول و حل کردم ولی مشکل دومی هم هست! الان کلمات پیدا میشن یعنی اشکالی که در پر کردن جداول مجازی بود حل شده ولی این کد برای متغیرهایی که مقدار ندارن درست کار نمیکنه!

(Case When EXISTS (SELECT 1 FROM @LetterWords01) Then Letters.Id End In (Select LetterId From @LetterWords01))

این کد وقتی مقدار شرط false باشه درست عمل نمیکنه!!

ASKaffash
دوشنبه 14 دی 1394, 07:27 صبح
سلام
من یک پیشنهاد دارم :
شما در یک حلقه پارامترهای ورودی که دارای مقدار هستند را درون یک جدول موقت (به شکل #) بریز بعد دستور SQL روی جدول مورد نظر را با شرط ذیل انجام بده :

Select *
From T
Where Word In(Select Word From #WordTable)