2015-09-30 11 views
5

Thủ tục FunctionX, Line 345Tricks về cách thực hiện chuỗi bên trong một hàm trong Sql Server

sử dụng không hợp lệ của một nhà điều hành phụ ảnh hưởng 'EXECUTE STRING' trong một hàm .

Tôi nhận được lỗi ở trên khi tôi thực thi câu lệnh động bên trong một hàm trong SQL Server 2012. Có cách giải quyết nào cho vấn đề này không? Bất kỳ thủ đoạn nào?

PS: Sproc (thủ tục lưu sẵn) quá dài để cơ thể được chèn vào bên trong hàm.

DECLARE @execsql NVARCHAR(2000) 
Set @execsql = 'INSERT INTO @TABLE1 EXEC SPROC1 ' + @ID_COMPANY + ',' + @ID_COUNTRY 
exec (@execsql) 

Rất cám ơn trước.

Ngoài ra, tôi cũng cần có khả năng xóa bên trong hàm. Tôi biết điều này mâu thuẫn với quy định chức năng, nhưng tôi tự hỏi nếu có một số thủ thuật có thể được sử dụng

+0

Câu hỏi lớn hơn là tại sao bạn cho rằng bạn cần sử dụng chức năng ở đây? Một hàm được thiết kế để trả về một giá trị duy nhất, nó không phải là một thủ tục được lưu trữ mà là những gì bạn mô tả. –

Trả lời

6

Không không có thủ đoạn, xem The Curse and Blessings of Dynamic SQL

động SQL trong User-Defined Functions

Điều này rất đơn giản: bạn không thể sử dụng SQL động từ các hàm được sử dụng đã xác định được sử dụng được viết bằng T-SQL. Điều này là do bạn không được phép làm bất kỳ thứ gì trong UDF có thể thay đổi trạng thái cơ sở dữ liệu (vì UDF có thể được gọi là một phần của truy vấn). Vì bạn có thể làm bất cứ điều gì từ SQL động , bao gồm các bản cập nhật, rõ ràng là tại sao SQL động không được cho phép .

Tôi đã xem nhiều hơn một bài đăng trên các nhóm tin tức nơi mọi người đã bị đập đầu của họ chống lại điều này. Nhưng nếu bạn muốn sử dụng SQL động trong một UDF, hãy quay lại và làm lại thiết kế của bạn. Bạn đã gặp phải rào cản và trong SQL 2000 không có cách nào thoát ra ngoài.

Trong SQL 2005 trở lên, bạn có thể triển khai hàm của mình dưới dạng hàm CLR . Nhớ lại rằng tất cả truy cập dữ liệu từ CLR là SQL động. (Bạn được bảo vệ an toàn, để nếu bạn thực hiện thao tác cập nhật từ chức năng của mình, bạn sẽ bị bắt.) Cảnh báo mặc dù: dữ liệu truy cập từ UDF vô hướng thường có thể gây ra sự cố hiệu suất. Nếu bạn nói

SELECT ... FROM tbl ĐÂU dbo.MyUdf (somecol) = @value

và MyUdf thực hiện truy cập dữ liệu, bạn đã ít nhiều tạo ra một ẩn con trỏ.

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