Bạn biết cách làm sp_MSforeachtable
là không có giấy tờ và có thể biến mất bất cứ lúc nào / được sửa đổi?
Chà, nếu bạn vui lòng bỏ qua điều đó, nó có một tham số khác được gọi là @whereand
, được nối vào WHERE
mệnh đề của truy vấn nội bộ đang được sử dụng để tìm các bảng (và phải bắt đầu bằng AND
).
Bạn cũng phải biết rằng có một bí danh, o
chống lại sysobjects
và bí danh thứ hai syso
chống lại sys.all_objects
.
Sử dụng kiến thức này, bạn có thể tạo @whereand
của mình tham số như:
EXEC sp_MSforeachtable
@command1='...',
@whereand='AND o.id in (select object_id from sys.columns c where c.name=''EMP_CODE'')'
Giờ đây, bạn cũng có thể đơn giản hóa command1
của mình , vì bạn biết rằng nó sẽ chỉ được chạy trên các bảng có chứa EMP_CODE
cột. Tôi có thể lấy ra COUNT(*)
điều kiện cũng vậy, vì tôi không thấy nó đang thêm giá trị gì.
Đã cập nhật dựa trên công việc tiếp theo của bạn và được kiểm tra dựa trên một bảng:
DECLARE @EMPCODE AS VARCHAR(20)
SET @EMPCODE='HO081'
declare @sql nvarchar(2000)
set @sql = '
DECLARE @COUNT AS INT
SELECT @COUNT=COUNT(*) FROM ? WHERE EMP_CODE='''[email protected]+'''
IF @COUNT>0
BEGIN
PRINT PARSENAME("?",1)+'' => ''+CONVERT(VARCHAR,@COUNT)+'' ROW(S)''
--PRINT ''DELETE FROM ''+PARSENAME("?",1)+'' WHERE EMP_CODE='''''[email protected]+'''''''
END
'
EXEC sp_MSforeachtable
@[email protected],@whereand='AND O.ID IN (SELECT OBJECT_ID FROM SYS.COLUMNS C WHERE C.NAME=''EMP_CODE'')'
(Tôi đã hoàn nguyên @whereand
để truy vấn cho EMP_CODE
, vì bạn không muốn thay thế giá trị ở đó).
Vấn đề là bạn có thể chuyển tham số đến một thủ tục được lưu trữ hoặc nghĩa đen , nhưng bạn không thể thực hiện các phép tính / kết hợp các hành động giữa chúng - vì vậy tôi đã chuyển việc xây dựng câu lệnh sql thành một hành động riêng biệt.