Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Suchen Sie dynamisch nach Spalten für eine bestimmte Tabelle

  1. Sie müssen nur Spalten durchsuchen, die tatsächlich Zeichenfolgen enthalten, nicht alle Spalten in einer Tabelle (die ganze Zahlen, Datumsangaben, GUIDs usw. enthalten können).
  2. Du solltest überhaupt keine #temp-Tabelle (und schon gar keine ##temp-Tabelle) brauchen.
  3. Sie müssen dynamisches SQL verwenden (obwohl ich nicht sicher bin, ob dies bisher Teil Ihres Lehrplans war).
  4. Ich finde es vorteilhaft, ein paar zu befolgen einfache Konventionen , gegen die Sie alle verstoßen haben:
    • benutze PROCEDURE nicht PROC - es ist kein "prock", es ist eine "gespeicherte Prozedur".
    • verwenden Sie dbo. (oder alternatives Schema) Präfix, wenn auf ein beliebiges Objekt verwiesen wird .
    • verpacken Sie Ihren Prozedurrumpf in BEGIN /END .
    • Verwenden Sie Vokale großzügig. Sparen Sie so viele Tastenanschläge, ganz zu schweigen von der Zeit, wenn Sie @tblname sagen statt @tablename oder @table_name ? Ich kämpfe nicht für eine bestimmte Konvention, aber das Sparen von Zeichen auf Kosten der Lesbarkeit hat in den 70er Jahren seinen Reiz verloren.
    • verwenden Sie nicht den sp_ Präfix für gespeicherte Prozeduren – dieses Präfix hat in SQL Server eine besondere Bedeutung. Benennen Sie das Verfahren für das, was es tut. Es braucht kein Präfix, genauso wie wir wissen, dass es sich auch ohne tbl um Tabellen handelt Präfix. Wenn Sie dort wirklich ein Präfix benötigen, verwenden Sie ein anderes wie usp_ oder proc_ aber ich persönlich glaube nicht, dass dieses Präfix Ihnen irgendwelche Informationen gibt, die Sie nicht bereits haben.
    • da Tabellen mit Unicode gespeichert werden (und einige Ihrer Spalten möglicherweise auch), sollten Ihre Parameter NVARCHAR sein , nicht VARCHAR . Und Bezeichner sind auf 128 Zeichen begrenzt, sodass es keinen Grund gibt,> 257 Zeichen für @tablename zu unterstützen .
    • Beenden Sie Anweisungen mit Semikolons .
    • Verwenden Sie die Katalogansichten anstelle von INFORMATION_SCHEMA - obwohl letzteres das ist, was Ihr Professor vielleicht gelehrt hat und erwarten könnte.
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

Wenn Sie zufrieden sind, dass es den SELECT ausgibt Abfrage, nach der Sie suchen, kommentieren Sie PRINT aus und kommentieren Sie die EXEC aus .