2014-07-26 3 views
5

J'ai écrit ceci pour rechercher une chaîne dans sql de n'importe quelle colonne dans une table mais dans certains cas il répond anormalement. L'exemple est donné ici.rechercher une chaîne dans sql à partir de n'importe quelle colonne dans une table

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

S'il vous plaît développer sur «répondre anormalement» et s'il vous plaît ajouter la balise RDBMS appropriée - est-ce SQL Server? –

+1

Oui c'est SQL Server, ici quand je donne comme '% f%' il renvoie une ligne. Mais dans cette rangée il n'y a pas de 'f' –

+0

Le code que vous avez posté n'a aucun sens. Vous insérez une seule ligne dans '@ tablepay', puis vous en sélectionnez une en utilisant une clause where qui n'a aucun rapport avec les enregistrements de la table_. Bref, votre code n'a absolument aucun sens. –

Répondre

1

Vous avez dit when I give like '%f%' it returns a row. But in that row there is no 'f'

Cela devrait être correct. Dans votre requête ci-dessous @clname ne fait pas partie de la variable de table @tablepay. donc il suffit de vérifier si la valeur du paramètre @clname contient f caractère et si true retourne la ligne de la table @tablepay mais cela ne garantit pas du tout que la table @tablepay doit avoir une ligne qui contient f caractère dans sur de sa colonne.

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

par structure de vous déposerez @tablepay comme ci-dessous

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

Si vous souhaitez rechercher des caractères f dans les colonnes de cette table, puis rechercher des colonnes de table directement comme

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

Pouvez-vous suggérer un moyen de rechercher une chaîne similaire dans un tableau particulier dans toutes les colonnes? –

+0

Vérifiez la réponse modifiée. – Rahul

+0

ici dans ce cas comment puis-je passer dynamiquement le nom de la colonne? –

0

S'il vous plaît voir cette réponse existe pour un exemple de ce que je demande PENSE:

Selecting column names that have specified value

Cette réponse particulière recherche toutes les colonnes de chaîne dans toutes les tables de la base de données. Vous pouvez facilement le modifier pour rechercher toutes les colonnes de chaîne dans une seule table particulière. Cela devrait vous donner le cadre que vous devez modifier pour obtenir ce que vous voulez.

Questions connexes