سؤال

أقوم ببناء نظام وضع علامات موحية (يبدو غير طبيعي) ، وأمر في سلسلة إلى 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top