Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Dynamicznie przeszukuj kolumny dla podanej tabeli

  1. Musisz przeszukać tylko kolumny, które faktycznie zawierają ciągi, a nie wszystkie kolumny w tabeli (co może zawierać liczby całkowite, daty, identyfikatory GUID itp.).
  2. Nie powinieneś w ogóle potrzebować tabeli #temp (a na pewno nie tabeli ##temp).
  3. Musisz użyć dynamicznego SQL (choć nie jestem pewien, czy do tej pory było to częścią twojego programu nauczania).
  4. Uważam za korzystne przestrzeganie kilku proste konwencje , z których wszystkie naruszyłeś:
    • użyj PROCEDURE nie PROC - to nie jest „procedura”, to „procedura składowana”.
    • użyj dbo. (lub alternatywnego schematu) przedrostek podczas odwoływania się do dowolnego obiektu .
    • zawiń treść procedury w BEGIN /END .
    • obficie używaj samogłosek. Oszczędzasz tyle naciśnięć klawiszy, nie mówiąc już o czasie, mówiąc @tblname? zamiast @tablename lub @table_name ? Nie walczę o konkretną konwencję, ale ratowanie postaci kosztem czytelności straciło swój urok w latach 70.
    • nie używaj sp_ prefiks dla procedur składowanych — ten prefiks ma specjalne znaczenie w SQL Server. Nazwij procedurę za to, co robi. Nie wymaga prefiksu, tak jak wiemy, że są to tabele, nawet bez tbl prefiks. Jeśli naprawdę potrzebujesz tam prefiksu, użyj innego, takiego jak usp_ lub proc_ ale osobiście nie uważam, że ten prefiks zawiera jakiekolwiek informacje, których jeszcze nie masz.
    • ponieważ tabele są przechowywane przy użyciu Unicode (a niektóre z Twoich kolumn też mogą być), Twoje parametry powinny mieć postać NVARCHAR , a nie VARCHAR . A identyfikatory są ograniczone do 128 znaków, więc nie ma powodu, aby obsługiwać> 257 znaków dla @table_name .
    • zakończ wypowiedzi średnikami .
    • użyj widoków katalogu zamiast INFORMATION_SCHEMA - chociaż to drugie jest tym, czego twój profesor mógł uczyć i może się spodziewać.
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

Kiedy jesteś zadowolony, że wysyła SELECT zapytanie, którego szukasz, skomentuj PRINT i odkomentuj EXEC .



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wartość null w typie danych varbinary parametru

  2. Jak wysłać e-mailem wyniki zapytania w SQL Server (T-SQL)

  3. Czy można zmodyfikować systemową procedurę składowaną?

  4. Jak zaktualizować kolumnę tożsamości w SQL Server?

  5. Używanie kursora w dbMail na serwerze sql 2008