我想要做的是在文本欄位中搜索值串列中的任何內容。
帶有文本欄位的表非常大,所以我無法加入 LIKE '%' valuename '%'(值串列臨時表不是特別大。)
我以為我會嘗試這樣做,但我需要在動態 WHERE 子句中獲取 % 周圍的單引號。也許這是不可能的。下面是一個例子:
CREATE TABLE #SearchValues (valuename VARCHAR(20))
INSERT INTO #SearchValues
VALUES ('Red235')
,('Blue678')
,('2Purple')
,('63Cyan')
,('99Black')
CREATE TABLE #TextTable (textfield VARCHAR(300))
INSERT INTO #TextTable
VALUES ('"Red235"')
,('blah and [99Black]')
,('something else')
,('n')
,('63Cyan')
,('other text')
,('nothing')
,('[2Purple]')
,('')
SELECT WhereClauseIWant = STUFF((
SELECT ' OR valuename LIKE %' valuename '%'
FROM #SearchValues
FOR XML PATH('')
), 1, 19, '') --this would be it except that it needs the single quotes around the %
SELECT *
FROM #TextTable
WHERE textfield LIKE STUFF((
SELECT ' OR valuename LIKE ' '%' valuename '%'
FROM #SearchValues
FOR XML PATH('')
), 1, 19, '')
uj5u.com熱心網友回復:
理想情況下,您應該只EXISTS在靜態查詢中使用謂詞。
SELECT *
FROM #TextTable T
WHERE EXISTS (SELECT 1
FROM #SearchValues s
WHERE t.textfield LIKE '%' s.valuename '%'
);
如果您真的開始使用動態 SQL,您顯然需要EXEC,并且您需要安全地執行此操作。你也有一些錯別字。
注意QUOTENAME安全注入和.value防止 XML 物體化的使用。
DECLARE @sql nvarchar(max) = N'
SELECT *
FROM #TextTable
WHERE 1=0
' (
SELECT '
OR textfield LIKE ' QUOTENAME('%' valuename '%', '''')
FROM #SearchValues
FOR XML PATH(''), TYPE
).value('text()[1]','nvarchar(max)');
PRINT @sql; -- for testing
EXEC sp_executesql @sql;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/323652.html
標籤:sql sql-server 查询语句
