Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Tìm kiếm động các cột cho bảng nhất định

  1. Bạn chỉ cần tìm kiếm các cột thực sự chứa chuỗi, không phải tất cả các cột trong bảng (có thể bao gồm số nguyên, ngày tháng, GUID, v.v.).
  2. Bạn không cần phải có bảng #temp (và chắc chắn không phải là bảng tạm thời ##).
  3. Bạn cần sử dụng SQL động (mặc dù tôi không chắc liệu đây có phải là một phần trong chương trình học của bạn cho đến nay hay không).
  4. Tôi thấy có lợi khi theo dõi một số quy ước đơn giản , tất cả những điều bạn đã vi phạm:
    • sử dụng PROCEDURE không phải PROC - nó không phải là một "thủ thuật", mà là một "thủ tục được lưu trữ".
    • sử dụng dbo. tiền tố (hoặc lược đồ thay thế) khi tham chiếu đến bất kỳ đối tượng nào .
    • bọc phần thân thủ tục của bạn trong BEGIN / END .
    • sử dụng các nguyên âm một cách phóng khoáng. Bạn có tiết kiệm được nhiều lần gõ phím như vậy không, bỏ qua thời gian, nói rằng @tblname thay vì @tablename hoặc @table_name ? Tôi không đấu tranh cho một quy ước cụ thể nhưng việc tiết kiệm các ký tự với chi phí dễ đọc đã mất đi sức hấp dẫn của nó vào những năm 70.
    • không sử dụng sp_ tiền tố cho các thủ tục được lưu trữ - tiền tố này có ý nghĩa đặc biệt trong SQL Server. Đặt tên cho thủ tục cho những gì nó làm. Nó không cần tiền tố, giống như chúng ta biết chúng là các bảng ngay cả khi không có tbl tiếp đầu ngữ. Nếu bạn thực sự cần một tiền tố ở đó, hãy sử dụng một tiền tố khác như usp_ hoặc proc_ nhưng cá nhân tôi không cảm thấy rằng tiền tố cung cấp cho bạn bất kỳ thông tin nào mà bạn chưa có.
    • vì các bảng được lưu trữ bằng Unicode (và một số cột của bạn có thể cũng vậy), các tham số của bạn phải là NVARCHAR , không phải VARCHAR . Và số nhận dạng được giới hạn ở 128 ký tự, vì vậy không có lý do gì để hỗ trợ> 257 ký tự cho @tablename .
    • chấm dứt câu lệnh bằng dấu chấm phẩy .
    • sử dụng chế độ xem danh mục thay vì INFORMATION_SCHEMA - mặc dù phần sau là những gì giáo sư của bạn có thể đã dạy và có thể mong đợi.
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

Khi bạn hài lòng vì nó xuất ra SELECT truy vấn bạn đang theo dõi, hãy nhận xét PRINT và bỏ ghi chú 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. Nhóm chỉ mục trên các cột không nhận dạng để tăng tốc độ chèn hàng loạt?

  2. Nhận thông tin dạng xem với dạng xem lược đồ thông tin VIEWS trong SQL Server

  3. Làm cách nào để convert (varchar, float) quyết định giữ bao nhiêu chữ số thập phân?

  4. Nhóm số đóng

  5. Chuyển đổi không thành công khi chuyển đổi giá trị varchar 'none' thành kiểu dữ liệu int