2012-06-19 28 views
7

Đây có thể là một câu trả lời dễ dàng nhưng tôi đã nhìn chằm chằm vào nó quá lâu ...Cú pháp truy vấn TSQL động đơn giản

Tôi có truy vấn sau đây lấy tham số nhập thủ tục được lưu trữ dưới dạng tên biến và số đếm các bản ghi trong bảng đó. Tôi muốn lấy kết quả của câu lệnh động (@toStartStr) vào một biến (@toStart).

-- @tempTableName = SProc input parameter 
DECLARE @toStartStr nvarchar(150); 
DECLARE @toStart int; 
SET @toStartStr = 'SELECT @toStart = COUNT(ID) FROM ' + @tempTableName; 
EXEC(@toStartStr); 

Ngay bây giờ, lỗi cho thấy @toStart không thể ghép nối với chuỗi SELECT, nhưng đây là ý chính của những gì tôi muốn. Ai có thể nhìn thấy những gì tôi đang làm sai? Hoặc đề xuất một giải pháp thay thế? FYI SQL 2008 R2. Cảm ơn.

Trả lời

11
DECLARE @sql NVARCHAR(255); 

DECLARE @toStart INT; 

SET @sql = N'SELECT @toStart = COUNT(ID) FROM ' + QUOTENAME(@tempTableName); 

EXEC sp_executesql @sql, N'@toStart INT OUTPUT', @toStart OUTPUT; 

PRINT @toStart; 

Tuy nhiên có một cách dễ dàng hơn và hiệu quả hơn để làm điều này, nếu bạn đang okay với phớt lờ hiện tại trên máy bay giao dịch (và bạn đang sử dụng SQL Server 2005 hoặc cao hơn - xin ghi rõ phiên bản khi hỏi những câu hỏi!).

DECLARE @toStart INT; 

SELECT @toStart = SUM(rows) 
    FROM sys.partitions 
    WHERE [object_id] = OBJECT_ID(@tempTableName) 
    AND index_id IN (0,1); 

PRINT @toStart; 

Chỉ cần cho đầy đủ, đây là một giải pháp cho SQL Server 2000, mà cũng không đòi hỏi bất kỳ ưu đãi đặc biệt (chỉ cần kết nối và là thành viên của công chúng):

DECLARE @toStart INT; 

SELECT @toStart = [rows] 
    FROM sysindexes 
    WHERE id = OBJECT_ID(@tempTableName) 
    AND indid IN (0,1); 

PRINT @toStart; 

Điều đó nói rằng, nếu bạn đang sử dụng một số để xác định ID tiếp theo có thể là gì, hoặc một cái gì đó như thế, tôi nghĩ bạn đang tiếp cận cách này sai, vì các hàng có thể bị xóa và nếu đó là giá trị cột nhận dạng có thể bị bỏ qua do các lần xuất hiện.

+0

Không phải lúc nào bạn cũng là người dùng ** sa **. Tôi nghĩ rằng quyền quản trị được yêu cầu để thực hiện truy vấn này. Đúng? – Pankaj

+0

Không, tôi chỉ thử nghiệm trên một hệ thống mà tôi không có quyền quản trị và nó chạy tốt. – JNK

+0

@Kanavi Không, quyền quản trị không cần thiết để xem sys.partitions. Bạn đã thử trước khi yêu cầu tôi xóa mã? –