SQL Server 2008 لا في () يبدو أنه يفشل
-
22-09-2019 - |
سؤال
أقوم ببناء نظام وضع علامات موحية (يبدو غير طبيعي) ، وأمر في سلسلة إلى DB وإذا كان هناك تطابق ، فإنه يرسل هذه العلامة. أريد إيقاف العلامات المكررة ، لذلك إذا كانت علامة واحدة على شبكة الإنترنت ، فأنا أريد فقط إرجاعها مرة واحدة. لذا ، إذا كان لدي ويب كعلامة ثم أضف أسبوعيًا ، فإن كتابة "نحن" لا تثير الويب للمرة الثانية كاقتراح.
ولكن يبدو أنه لا يعمل. أرسل العلامات الحالية وأستخدم لا في () لإزالة أي تكرارات. فيما يلي رمز SP:
SELECT TOP 1 t.vTagName As vTagName
FROM Tags t
WHERE t.vTagName LIKE @vTagName+'%'
AND t.nTagPortalId = @nPortalId
AND t.vTagName NOT IN(@vCurrentTags)
ORDER BY vTagName ASC
وهذا ما مرت في:
EXEC GetTagSuggest 'We','Web,Print,Design,Advertising,Revenue'
الرد على هذا الاستعلام هو vtagname = الويب. من الواضح أن هذه ليست نتيجة صحيحة لأنه يجب أن يكون اسم vtagname مثل "نحن" ليس في "الويب ، إلخ ..." ..
شكرا لك مقدما!
المحلول
في البيان لا يعمل هكذا.
ما يجب عليك فعله هو
t.vTagName not in ('Web','Print','Design','Advertising','Revenue')
وجوده في متغير واحد لن يعمل في هذه الحالة.
نصائح أخرى
تحتاج إلى تقسيم الأوتار ، أو تحويل عبارة SQL بأكملها إلى Dynamic SQL.
تعديل:
تقسيم المتغيرات لكل مثال آخر ، أو قم بعمل SQL ديناميكي.
هذه ليست أفضل الممارسات, ، ولكن ببساطة يعطيك فكرة:
DECLARE @sql nvarchar(max) = 'SELECT TOP 1 t.vTagName As vTagName '
SELECT @sql = @sql + 'FROM Tags t '
SELECT @sql = @sql + 'WHERE t.vTagName LIKE ' + @vTagName + '% '
SELECT @sql = @sql + 'AND t.nTagPortalId = ' + @nPortalId + ' '
SELECT @sql = @sql + 'AND t.vTagName NOT IN(' + @vCurrentTags + ') '
SELECT @sql = @sql + 'ORDER BY vTagName ASC'
EXEC sp_executesql @sql, @vTagName, @nPortalId, @vCurrentTags