2014-07-26 44 views
5

我編寫了這個表,用於從表中的任何列中的sql中搜索字符串,但在某些情況下,它響應異常。這裏給出了這個例子。從表中的任意一列在sql中搜索字符串

declare @tablepay table 
(
    payno varchar(500), 
    lastmodified nvarchar(500) 
) 

declare @columnname table 
(
    [rownumber] INT IDENTITY, 
    colname varchar(500) 
) 

insert into @tablepay (payno, lastmodified) 
    select 'PAY/2014','abcd' 

insert into @columnname(colname) 
    select TN.N.value('local-name(.)', 'sysname') as ColumnName 
    from 
     (select TV.* 
     from (select 1) as D(N) 
     outer apply (select top(0) * from @tablepay) as TV for xml path(''), elements xsinil, type) as TX(X) 
     cross apply TX.X.nodes('*') as TN(N) 

DECLARE @count INT 
DECLARE @begincount INT 
DECLARE @clname as VARCHAR(50)=''; 

SET @begincount = 1 

select @count = count(*) from @columnname 

declare @tlname varchar(50) 
set @tlname = '@tablepay' 

WHILE @begincount <= @count 
BEGIN 
    set @clname = (select colname from @columnname where rownumber = @begincount) 

    declare @text as varchar(100) 

    select * from @tablepay where @clname like '%f%' 

    SET @begincount = @begincount + 1 
END 
+4

請擴展'異常響應',請添加適當的RDBMS標記 - 它是SQL Server嗎? –

+1

是的,這是SQL Server,在這裏,當我給'%f%'時,它返回一行。但在那一行沒有'f' –

+0

你發佈的代碼沒有意義。你在'@ tablepay'中插入一行,然後從中選擇_using與table_中的記錄無關的where子句。總之你的代碼絕對沒有意義。 –

回答

1

你說when I give like '%f%' it returns a row. But in that row there is no 'f'

這應該是正確的。在您的以下查詢@clname不是表變量@tablepay的一部分。所以它只是檢查@clname參數值是否包含f字符,如果true從表@tablepay返回行,但不能保證表@tablepay必須有一行包含f字符。

select * from @tablepay where @clname like '%f%' 

每你表@tablepay的結構如下圖

declare @tablepay table 
(
    payno varchar(500), 
    lastmodified nvarchar(500) 
) 

如果要搜索字符f該表中的列然後搜索表列一樣,直接

select * from @tablepay where payno like '%f%' OR lastmodified like '%f%' 
+0

你能否提出一種在所有列中搜索特定表中相似字符串的方法 –

+0

查看編輯答案。 – Rahul

+0

這裏在這種情況下如何動態傳遞列名稱? –

0

請參閱這個現有答案爲我要求的THINK的示例:

Selecting column names that have specified value

此特定答案將搜索數據庫中所有表中的所有字符串列。您可以輕鬆修改它以在一個特定表中搜索所有字符串列。它應該給你你需要調整以獲得你想要的框架。

相關問題