Trong các tập lệnh, bạn có nhiều lựa chọn hơn và tốt hơn trong việc phân rã hợp lý. Xem xét chế độ SQLCMD (Menu truy vấn -> chế độ SQLCMD), cụ thể là các lệnh: setvar và: r.
Trong một quy trình được lưu trữ, các tùy chọn của bạn rất hạn chế. Bạn không thể tạo định nghĩa một hàm trực tiếp với phần thân của một thủ tục. Điều tốt nhất bạn có thể làm là như thế này, với SQL động:
create proc DoStuff
as begin
declare @sql nvarchar(max)
/*
define function here, within a string
note the underscore prefix, a good convention for user-defined temporary objects
*/
set @sql = '
create function dbo._object_name_twopart (@object_id int)
returns nvarchar(517) as
begin
return
quotename(object_schema_name(@object_id))+N''.''+
quotename(object_name(@object_id))
end
'
/*
create the function by executing the string, with a conditional object drop upfront
*/
if object_id('dbo._object_name_twopart') is not null drop function _object_name_twopart
exec (@sql)
/*
use the function in a query
*/
select object_id, dbo._object_name_twopart(object_id)
from sys.objects
where type = 'U'
/*
clean up
*/
drop function _object_name_twopart
end
go
Điều này gần đúng với một hàm tạm thời toàn cục, nếu một thứ như vậy tồn tại. Nó vẫn hiển thị với những người dùng khác. Bạn có thể thêm @@ SPID của kết nối của mình để chỉ định tên duy nhất, nhưng điều đó sẽ yêu cầu phần còn lại của quy trình cũng phải sử dụng SQL động.