2010-10-04 43 views
6

Đầu tiên tôi cố giải thích hoàn cảnh. Tôi lưu trữ biểu thức lọc trong một cột được phân cách bằng dấu ngắt dòng. Ý tưởng cơ bản là:Tại sao không thể sử dụng câu lệnh INSERT EXEC trong một thủ tục được lưu trữ được gọi bởi một thủ tục lưu sẵn khác?

SELECT 
'SELECT ''' + REPLACE(topic_filter,CHAR(10),''' UNION ALL SELECT ''') + '''' 
FROM dbo.topic_filter T 
WHERE 
    T.id = @id 
FOR XML PATH('') 

Sau này, tôi chỉ cần thực hiện chuỗi này để đưa số liệu vào bảng tạm thời. Sự cố của tôi bắt đầu ở đây. Đoạn mã nằm trong quy trình được lưu trữ và được sử dụng bởi nhiều quy trình được lưu trữ để tạo nguồn cơ sở để lấp đầy.
Cách tiếp cận 1:
Gọi sp này từ một SP khác để điền vào bảng tạm thời.
Kết quả 1:
Không thể lồng nhau câu lệnh INSERT EXEC. (. Nếu tôi gọi đơn giản với dbo exec ... phong cách mã đang làm việc tôi chỉ nhận được lỗi nếu tôi cố gắng gọi trong vòng một stored procedure)

Phương pháp 2:
tôi đặt đoạn mã trên vào một bảng hàm giá trị.
Kết quả 2:
Sử dụng không hợp lệ toán tử tác dụng phụ 'INSERT EXEC' trong một hàm. (Chức năng bản thân không biên soạn)

Cảm ơn,
Péter

Trả lời

4

Trong thời gian chờ đợi, tôi đã giải quyết được vấn đề (với trợ giúp :)). Giải pháp rất đơn giản:

exec('insert into t2 ' + @str) 

Trường hợp @str chứa câu lệnh chọn.
Tôi không biết tại sao nhưng cách này không có lỗi. Phương pháp tôi gọi là thủ tục được lưu trữ:

SET @exec = 'exec dbo.trFilterTopic ''' + @id+ ''',null,null,1' 
INSERT INTO #filtered 
exec (@exec) 

Tôi hy vọng tôi dành chút thời gian cho những người khác với giải pháp này.
Bye,
Péter

+2

Điều này không hoạt động.Ít nhất trong MS Transact SQL 2008. – Jackson

2

Đây là một hạn chế SQL Server. Bạn không thể có một lồng nhau insert exec (Tôi không chắc chắn lý do tại sao).

Nếu bạn đi:

insert into t(value) 
exec dbo.proc 

, và bên trong dbo.proc bạn có

insert into t2(value2) 
exec(@str) 

, sau đó nó sẽ không chạy.

Cân nhắc các cách khác nhau để truyền bảng xung quanh, chẳng hạn như temporary tables hoặc table-valued parameters.

+0

Hi GSerg, tôi không hiểu làm thế nào điều này ảnh hưởng đến vấn đề cốt lõi. Phần mà chuỗi được chuyển đổi thành một bảng vẫn phải nằm ở dưới cùng của callstack. Vì vậy, đơn giản hóa câu hỏi của tôi, làm thế nào để đưa chuỗi đó vào một bảng và sử dụng các kết quả trong các thủ tục được lưu trữ ở trên nó? Cảm ơn, Péter –

+0

Chỉ cần đoán, nhưng để tránh một vòng lặp vô hạn. –

-1

Chức năng trên SQL Server có những hạn chế, họ arenot thủ tục, bạn không thể sử dụng SQL động như 'EXECUTE STRING', 'INSERT EXEC' ...

Các vấn đề liên quan