Pertanyaan Dapatkah saya membuat Fungsi Sekali-Waktu dalam Naskah atau Prosedur Tersimpan?


Di SQL Server 2005, apakah ada konsep penggunaan satu kali, atau fungsi lokal yang dideklarasikan di dalam skrip SQL atau Stored Procedure? Saya ingin mengaburkan beberapa kerumitan dalam naskah yang saya tulis, tetapi itu akan membutuhkan kemampuan untuk mendeklarasikan suatu fungsi.

Hanya penasaran.


76
2018-06-11 14:30


asal


Jawaban:


Anda bisa menelepon CREATE Function dekat awal skrip Anda dan DROP Function mendekati akhir.


52
2018-06-11 14:32



Anda dapat membuat temp stored procedure seperti:

create procedure #mytemp as
begin
   select getdate() into #mytemptable;
end

dalam skrip SQL, tetapi tidak berfungsi. Anda bisa memiliki toko proc itu hasil dalam tabel temporer, kemudian gunakan informasi itu nanti di skrip ..


63
2018-06-11 14:37



Ekspresi Tabel Umum biarkan Anda menentukan apa yang dasarnya dilihat yang hanya bertahan dalam lingkup pernyataan pilih, masukkan, perbarui, dan hapus. Tergantung pada apa yang perlu Anda lakukan, mereka bisa sangat berguna.


20
2018-06-11 14:35



Saya tahu saya mungkin dikritik karena menyarankan SQL dinamis, tetapi terkadang itu solusi yang baik. Pastikan Anda memahami implikasi keamanan sebelum Anda mempertimbangkan ini.

DECLARE @add_a_b_func nvarchar(4000) = N'SELECT @c = @a + @b;';
DECLARE @add_a_b_parm nvarchar(500) = N'@a int, @b int, @c int OUTPUT';

DECLARE @result int;
EXEC sp_executesql @add_a_b_func, @add_a_b_parm, 2, 3, @c = @result OUTPUT;
PRINT CONVERT(varchar, @result); -- prints '5'

6
2017-09-23 17:23



Dalam skrip Anda memiliki lebih banyak opsi dan bidikan yang lebih baik pada dekomposisi rasional. Lihatlah ke mode SQLCMD (Menu Kueri -> mode SQLCMD), khususnya: perintah setvar dan: r.

Dalam prosedur yang tersimpan, opsi Anda sangat terbatas. Anda tidak dapat membuat mendefinisikan fungsi secara langsung dengan badan prosedur. Yang terbaik yang dapat Anda lakukan adalah sesuatu seperti ini, dengan SQL dinamis:

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

Ini mendekati fungsi sementara global, jika hal semacam itu ada. Masih terlihat oleh pengguna lain. Anda dapat menambahkan @@ SPID koneksi Anda untuk meng-uniqueifikasi nama, tetapi itu akan membutuhkan prosedur lainnya untuk menggunakan SQL dinamis juga.


2
2018-06-12 05:29



Di bawah ini adalah apa yang saya gunakan di masa lalu untuk mencapai kebutuhan akan UDF Skalar di MS SQL:

IF OBJECT_ID('tempdb..##fn_Divide') IS NOT NULL DROP PROCEDURE ##fn_Divide
GO
CREATE PROCEDURE ##fn_Divide (@Numerator Real, @Denominator Real) AS
BEGIN
    SELECT Division =
        CASE WHEN @Denominator != 0 AND @Denominator is NOT NULL AND  @Numerator != 0 AND @Numerator is NOT NULL THEN
        @Numerator / @Denominator
        ELSE
            0
        END
    RETURN
END
GO

Exec ##fn_Divide 6,4

Pendekatan ini yang menggunakan variabel global untuk PROSEDUR memungkinkan Anda untuk menggunakan fungsi tidak hanya di skrip Anda, tetapi juga dalam kebutuhan Dynamic SQL Anda.


2
2017-08-29 20:49