Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Cerca in modo dinamico le colonne per una determinata tabella

  1. Devi cercare solo nelle colonne che contengono effettivamente stringhe, non in tutte le colonne di una tabella (che possono includere numeri interi, date, GUID, ecc.).
  2. Non dovresti aver bisogno di una tabella #temp (e certamente non di una tabella ##temp).
  3. Devi usare SQL dinamico (anche se non sono sicuro che questo sia stato parte del tuo curriculum finora).
  4. Trovo utile seguirne alcuni semplici convenzioni , che hai violato tutti:
    • usa PROCEDURE non PROC - non è un "prock", è una "procedura memorizzata".
    • usa dbo. (o schema alternativo) prefisso quando si fa riferimento a qualsiasi oggetto .
    • avvolgi il corpo della procedura in BEGIN /END .
    • usa le vocali liberamente. Stai risparmiando così tante battute, non importa tempo, dicendo @tblname invece di @tablename o @table_name ? Non sto combattendo per una convenzione specifica, ma salvare i personaggi a scapito della leggibilità ha perso il suo fascino negli anni '70.
    • non utilizzare sp_ prefisso per le stored procedure:questo prefisso ha un significato speciale in SQL Server. Assegna un nome alla procedura per ciò che fa. Non ha bisogno di un prefisso, proprio come sappiamo che sono tabelle anche senza un tbl prefisso. Se hai davvero bisogno di un prefisso, usane un altro come usp_ o proc_ ma personalmente non credo che quel prefisso ti dia informazioni che non hai già.
    • poiché le tabelle sono archiviate utilizzando Unicode (e potrebbero esserlo anche alcune delle tue colonne), i tuoi parametri dovrebbero essere NVARCHAR , non VARCHAR . E gli identificatori hanno un limite di 128 caratteri, quindi non c'è motivo di supportare> 257 caratteri per @tablename .
    • termina le affermazioni con punto e virgola .
    • usa le viste del catalogo invece di INFORMATION_SCHEMA - anche se quest'ultimo è ciò che il tuo professore potrebbe aver insegnato e potrebbe aspettarsi.
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

Quando sei felice che stia emettendo il SELECT query che stai cercando, commenta il PRINT e decommenta il EXEC .