sql >> Database >  >> RDS >> Sqlserver

Dynamisch zoeken in kolommen voor een bepaalde tabel

  1. U hoeft alleen kolommen te zoeken die daadwerkelijk tekenreeksen bevatten, niet alle kolommen in een tabel (die gehele getallen, datums, GUID's, enz. kunnen bevatten).
  2. Je zou helemaal geen #temp-tabel (en zeker geen ##temp-tabel) nodig moeten hebben.
  3. Je moet dynamische SQL gebruiken (hoewel ik niet zeker weet of dit tot nu toe deel uitmaakte van je curriculum).
  4. Ik vind het nuttig om een paar te volgen eenvoudige conventies , die je allemaal hebt geschonden:
    • gebruik PROCEDURE niet PROC - het is geen "prock", het is een "opgeslagen procedure".
    • gebruik dbo. (of alternatief schema) voorvoegsel bij het verwijzen naar een object .
    • verpak je proceduretekst in BEGIN /END .
    • gebruik klinkers royaal. Bespaar je zoveel toetsaanslagen, laat staan ​​tijd, door @tblname te zeggen? in plaats van @tablename of @table_name ? Ik vecht niet voor een specifieke conventie, maar het opslaan van karakters ten koste van de leesbaarheid verloor zijn charme in de jaren 70.
    • gebruik de sp_ . niet voorvoegsel voor opgeslagen procedures - dit voorvoegsel heeft een speciale betekenis in SQL Server. Noem de procedure voor wat het doet. Het heeft geen voorvoegsel nodig, net zoals we weten dat het tabellen zijn, zelfs zonder een tbl voorvoegsel. Als je daar echt een voorvoegsel nodig hebt, gebruik dan een andere, zoals usp_ of proc_ maar persoonlijk heb ik niet het gevoel dat dat voorvoegsel je informatie geeft die je nog niet hebt.
    • aangezien tabellen worden opgeslagen met Unicode (en sommige van uw kolommen kunnen dat ook zijn), moeten uw parameters NVARCHAR zijn , niet VARCHAR . En identifiers zijn beperkt tot 128 tekens, dus er is geen reden om> 257 tekens voor @tablename te ondersteunen .
    • beëindig uitspraken met puntkomma's .
    • gebruik de catalogusweergaven in plaats van INFORMATION_SCHEMA - hoewel dit laatste is wat je professor misschien heeft geleerd en zou kunnen verwachten.
CREATE PROCEDURE dbo.SearchTable
    @tablename NVARCHAR(257),
    @term      NVARCHAR(4000)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @sql NVARCHAR(MAX);

    SET @sql = N'SELECT * FROM ' + @tablename + ' WHERE 1 = 0'; 

    SELECT @sql = @sql + ' 
      OR ' + c.name + ' LIKE ''%' + REPLACE(@term, '''', '''''') + '%'''
    FROM 
      sys.all_columns AS c
    INNER JOIN 
      sys.types AS t
      ON c.system_type_id = t.system_type_id
      AND c.user_type_id = t.user_type_id
    WHERE 
      c.[object_id] = OBJECT_ID(@tablename)
      AND t.name IN (N'sysname', N'char', N'nchar', 
        N'varchar', N'nvarchar', N'text', N'ntext');

    PRINT @sql;

    -- EXEC sp_executesql @sql;
END
GO

Als je tevreden bent dat het de SELECT . uitvoert de vraag die je zoekt, reageer dan op de PRINT en verwijder de commentaar bij de EXEC .



  1. Recursieve trigger voorkomen in PostgreSQL

  2. Reguliere expressies binnen SQL Server

  3. URL-parameters gebruiken bij zoeken in MYSQL

  4. Kan geen Arabische tekens invoegen in de Oracle-database