Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Динамично търсене на колони за дадена таблица

  1. Трябва да търсите само колони, които действително съдържат низове, а не всички колони в таблица (които може да включват цели числа, дати, GUID и т.н.).
  2. Въобще не трябва да имате нужда от #temp таблица (и със сигурност не ##temp таблица).
  3. Трябва да използвате динамичен SQL (макар че не съм сигурен дали това е било част от вашата учебна програма досега).
  4. Намирам за полезно да следвам няколко прости конвенции , всички от които сте нарушили:
    • използвайте PROCEDURE не PROC - това не е "прок", това е "съхранена процедура."
    • използвайте dbo. (или алтернативна схема) префикс при препратка към който и да е обект .
    • обвийте тялото на вашата процедура в BEGIN /END .
    • използвайте щедро гласни. Спестявате ли толкова много натискания на клавиши, без значение време, казвайки @tblname вместо @tablename или @table_name ? Не се боря за конкретна конвенция, но спестяването на знаци за сметка на четливостта загуби своя чар през 70-те години.
    • не използвайте sp_ префикс за съхранени процедури - този префикс има специално значение в SQL Server. Назовете процедурата за това, което прави. Не се нуждае от префикс, точно както знаем, че са таблици дори без tbl префикс. Ако наистина имате нужда от префикс там, използвайте друг като usp_ или proc_ но аз лично не смятам, че този префикс ви дава информация, която вече нямате.
    • тъй като таблиците се съхраняват с помощта на Unicode (и някои от вашите колони също може да бъдат), вашите параметри трябва да бъдат NVARCHAR , а не VARCHAR . И идентификаторите са ограничени до 128 знака, така че няма причина да се поддържат> 257 знака за @tablename .
    • завършване на изрази с точка и запетая .
    • използвайте изгледите на каталога вместо INFORMATION_SCHEMA - въпреки че последното е това, което вашият професор може да е преподавал и може да очаква.
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

Когато сте доволни, че извежда SELECT заявка, която преследвате, коментирайте PRINT и разкоментирайте 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. Как да разбера какво заключва масите ми?

  2. Защо CTE (рекурсивен) не е паралелен (MAXDOP=8)?

  3. Защо SSIS не разпознава разделителя на ред {LF} за подаване на ред, докато импортира UTF-8 плосък файл?

  4. Запазването на XML съдържание с кодиране ISO-8859-1 с помощта на Entity Framework в XML колоната на SQL Server 2008 дава грешка при кодиране

  5. Как да изпълним SSIS пакет, когато файлът пристигне в папката