sql >> Databáze >  >> RDS >> Sqlserver

Dynamicky vyhledávat sloupce pro danou tabulku

  1. Musíte hledat pouze sloupce, které skutečně obsahují řetězce, nikoli všechny sloupce v tabulce (která může obsahovat celá čísla, data, GUID atd.).
  2. Vůbec byste neměli potřebovat #temp tabulku (a už vůbec ne ##temp tabulku).
  3. Musíte používat dynamické SQL (ačkoli si nejsem jistý, zda to bylo doposud součástí vašeho učebního plánu).
  4. Považuji za přínosné sledovat několik jednoduché konvence , které jste všechny porušili:
    • použijte PROCEDURE ne PROC - není to "prock", je to "uložená procedura."
    • použijte dbo. (nebo alternativní schéma) předpona při odkazování na jakýkoli objekt .
    • zabalte tělo procedury do BEGIN /END .
    • volně používat samohlásky. Ušetříte tolik úhozů, bez ohledu na čas, když řeknete @tblname místo @tablename nebo @tablename ? Nebojuji za konkrétní konvenci, ale záchrana znaků za cenu čitelnosti ztratila v 70. letech své kouzlo.
    • nepoužívejte sp_ prefix pro uložené procedury - tento prefix má v SQL Server speciální význam. Pojmenujte postup, co dělá. Nepotřebuje předponu, stejně jako víme, že jsou to tabulky i bez tbl předpona. Pokud tam opravdu potřebujete předponu, použijte jinou, například usp_ nebo proc_ ale osobně nemám pocit, že by vám tato předpona poskytovala nějaké informace, které byste ještě neměli.
    • protože jsou tabulky uloženy pomocí Unicode (a některé vaše sloupce mohou být také), vaše parametry by měly být NVARCHAR , nikoli VARCHAR . A identifikátory jsou omezeny na 128 znaků, takže není důvod podporovat> 257 znaků pro @tablename .
    • ukončit příkazy středníkem .
    • použijte zobrazení katalogu namísto INFORMATION_SCHEMA - ačkoli to je to, co váš profesor možná učil a mohl očekávat.
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

Když jste spokojeni, že to vydává SELECT dotaz, který hledáte, zakomentujte PRINT a odkomentujte EXEC .



  1. Jak vytvořit databázi Accessu v cloudu

  2. Co znamená znak potrubí/veritcal bar v TSQL?

  3. pokouším se upgradovat starou aplikaci Java jsf

  4. Jak uložit velmi stará data do databáze?