- 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.).
- 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 ##).
- 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).
- 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ảiPROC
- 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ặcproc_
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ảiVARCHAR
. 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.
- sử dụng
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
.