iT邦幫忙

0

如何撰寫 MS-Sql資料表函數?

  • 分享至 

  • xImage

想請教一下,一串sql 查詢指令 想用參數查詢出不同欄位數資料
試問
1.)該用預存程序? 還是 資料表函數?
2.)嘗試資料表函數 一直有警告函數的參數 必須宣告純量變數 ?

例如: 原始
select A1,A2,A3,A4,A5 from table

想透過 不同參數
例如
[參數 0] 全部
select A1,A2,A3,A4,A5 from table
[參數 1] 少兩欄
select A1,A2,A3 from table

初次嘗試,想將vba 傳遞的sql查詢 改寫在sql server上。

player iT邦大師 1 級 ‧ 2023-01-18 13:13:09 檢舉
預存程序
https://learn.microsoft.com/zh-tw/sql/relational-databases/stored-procedures/stored-procedures-database-engine?view=sql-server-ver16

使用者自訂函數
https://learn.microsoft.com/zh-tw/sql/relational-databases/user-defined-functions/user-defined-functions?view=sql-server-ver16

如果要用SQL原本不支援的功能
還可以用C#寫SQL CLR
https://learn.microsoft.com/zh-tw/sql/relational-databases/user-defined-functions/create-clr-functions?view=sql-server-ver16
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
小山丘
iT邦新手 2 級 ‧ 2023-01-16 11:55:13
最佳解答

我是用預存程序
然後設一個參數例如@type

if(@type='1')
begin
  select A1,A2,A3,A4,A5 from table
end
if(@type='2')
begin
  select A1,A2,A3 from table
end
看更多先前的回應...收起先前的回應...
achan iT邦研究生 4 級 ‧ 2023-01-16 12:58:40 檢舉

謝謝你的回應,方便提供完整寫法嗎?
我的參數傳遞出了問題...

小山丘 iT邦新手 2 級 ‧ 2023-01-16 13:34:59 檢舉

預存程序的寫法嗎?

achan iT邦研究生 4 級 ‧ 2023-01-16 15:25:36 檢舉

對,第一次寫 還沒搞懂觀念..

設定了參數 但 回傳table <--使用return?
卻不知道怎麼定義,會因為參數而變小的table

小山丘 iT邦新手 2 級 ‧ 2023-01-16 16:19:52 檢舉

CREATE PROCEDURE [dbo].[sp_TABLE_INFO]
(
    @ID          VARCHAR(20),
    @TYPE        VARCHAR(1)    
)
AS
BEGIN
  IF(@TYPE='0')
  BEGIN
    select A1,A2,A3,A4,A5 
    from table
    WHERE ID=ID
  END
  ELSE IF(@TYPE='1')
  BEGIN
    select A1,A2,A3 
    from table
    WHERE ID=ID
  END
END

假設上面先建立這個預存
然後就是用
EXEC sp_TABLE_INFO '9453','0'
這樣直接呼叫預存就能得到table了

achan iT邦研究生 4 級 ‧ 2023-01-17 21:18:49 檢舉

謝謝你提供的解答,發現if後面如您的範例加上()即可⋯初學還有很多坑(^_^)a

0
尼克
iT邦大師 1 級 ‧ 2023-01-16 13:38:10
achan iT邦研究生 4 級 ‧ 2023-01-16 15:23:05 檢舉

謝謝你提供的網址 比較清楚易懂

0
alien663
iT邦研究生 3 級 ‧ 2023-01-16 15:23:04

預存程序,然後用動態的方式組Query

create procedure xp_test @columns nvarchar(1024)
as begin
    exec('select ' + @columns + ' from tables')
end
achan iT邦研究生 4 級 ‧ 2023-01-16 15:32:53 檢舉

1.請問一下 exec( ) 裡面如何 撰寫if else ?
2. 若 用 declare @sql as NVARCHAR(MAX),
set @sql ='select .... ' 又有 if 參數=? 的變化
如何更改?

alien663 iT邦研究生 3 級 ‧ 2023-01-16 16:02:51 檢舉

這只是一個動態Query的範例,請根據你的實際需求去修改,你可以想成要組出一個Query的字串,然後拿去執行而已,中間組字串隨便你要怎樣做都可以,只要最後結果符合你要的Query就行。

會建議使用預存程序,原因是執行權限與function不同,詳情可以自己googlesql procedure vs. function,以程式設計的角度來說,要使用預存程序或函數,應該要考慮到需要的權限為何,並盡量以最小權限去做。

至於語法和中間邏輯,就麻煩你自己去思考,我給的解答只會是魚竿不是魚乾。

achan iT邦研究生 4 級 ‧ 2023-01-16 16:10:11 檢舉

謝謝您的回答,我會細細思量。

我要發表回答

立即登入回答