sql >> Databasteknik >  >> RDS >> Sqlserver

Sök dynamiskt efter en given tabell i kolumner

  1. Du behöver bara söka efter kolumner som faktiskt innehåller strängar, inte alla kolumner i en tabell (som kan inkludera heltal, datum, GUID, etc).
  2. Du borde inte behöva en #temp-tabell (och absolut inte en ##temp-tabell) alls.
  3. Du måste använda dynamisk SQL (även om jag inte är säker på om detta har varit en del av din läroplan hittills).
  4. Jag tycker att det är fördelaktigt att följa några enkla konventioner , som du har brutit mot:
    • använd PROCEDURE inte PROC - det är inte en "prick", det är en "lagrad procedur."
    • använd dbo. (eller alternativt schema) prefix när du refererar till något objekt .
    • linda in din procedurtext i BEGIN /END .
    • använd vokaler rikligt. Sparar du så många tangenttryckningar, strunt i tid, säg @tblname istället för @tablename eller @tablename ? Jag kämpar inte för en specifik konvention men att spara karaktärer på bekostnad av läsbarhet förlorade sin charm på 70-talet.
    • använd inte sp_ prefix för lagrade procedurer - detta prefix har speciell betydelse i SQL Server. Namnge proceduren för vad den gör. Det behöver inget prefix, precis som vi vet att de är tabeller även utan en tbl prefix. Om du verkligen behöver ett prefix där, använd ett annat som usp_ eller proc_ men jag personligen tycker inte att prefixet ger dig någon information du inte redan har.
    • eftersom tabeller lagras med Unicode (och vissa av dina kolumner kanske också är det), bör dina parametrar vara NVARCHAR , inte VARCHAR . Och identifierare är begränsade till 128 tecken, så det finns ingen anledning att stödja> 257 tecken för @tablename .
    • avsluta uttalanden med semikolon .
    • använd katalogvyerna istället för INFORMATION_SCHEMA - även om det senare är vad din professor kan ha lärt ut och kan förvänta sig.
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

När du är glad att den matar ut SELECT fråga du är ute efter, kommentera PRINT och avkommentera EXEC .



  1. Kvalificerar ett temporärt tabellkolumnnamn i jOOQ

  2. mysql - hur många kolumner är för många?

  3. Lägg till en ny kolumn i en stor mysql-tabell

  4. Dynamic Select SQL-satser med MyBatis