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

Søg dynamisk i kolonner efter en given tabel

  1. Du skal kun søge efter kolonner, der faktisk indeholder strenge, ikke alle kolonner i en tabel (som kan omfatte heltal, datoer, GUID'er osv.).
  2. Du burde slet ikke have brug for en #temp tabel (og bestemt ikke en ##temp tabel).
  3. Du skal bruge dynamisk SQL (selvom jeg ikke er sikker på, om dette har været en del af dit læseplan indtil videre).
  4. Jeg finder det en fordel at følge nogle få simple konventioner , som du alle har overtrådt:
    • brug PROCEDURE ikke PROC - det er ikke en "prock", det er en "lagret procedure."
    • brug dbo. (eller alternativt skema) præfiks, når der henvises til ethvert objekt .
    • indpak din proceduretekst i BEGIN /END .
    • brug vokaler rigeligt. Sparer du så mange tastetryk, pyt med tid ved at sige @tblname i stedet for @tablename eller @table_name ? Jeg kæmper ikke for en bestemt konvention, men at gemme karakterer på bekostning af læsbarhed mistede sin charme i 70'erne.
    • brug ikke sp_ præfiks for lagrede procedurer - dette præfiks har en særlig betydning i SQL Server. Navngiv proceduren for, hvad den gør. Det behøver ikke et præfiks, ligesom vi ved, at det er tabeller, selv uden en tbl præfiks. Hvis du virkelig har brug for et præfiks der, så brug et andet som usp_ eller proc_ men jeg føler personligt ikke, at præfikset giver dig nogen information, du ikke allerede har.
    • da tabeller er gemt ved hjælp af Unicode (og nogle af dine kolonner kan også være det), skal dine parametre være NVARCHAR , ikke VARCHAR . Og identifikatorer er begrænset til 128 tegn, så der er ingen grund til at understøtte> 257 tegn for @tablename .
    • afslut udsagn med semikolon .
    • brug katalogvisningerne i stedet for INFORMATION_SCHEMA - selvom det sidste er, hvad din professor måske har undervist i og kunne forvente.
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 er glad for, at den udsender SELECT forespørgsel du leder efter, kommenter PRINT og fjern kommentaren til EXEC .



  1. DatabaseError:nuværende transaktion er afbrudt, kommandoer ignoreret indtil slutningen af ​​transaktionsblok?

  2. WHILE syntaks-fejl i MySQL

  3. SQL-problem med betalingstider

  4. Oprettelse eller simulering af todimensionelle arrays i PL/SQL