存儲過程拼接
你的問題,問的不是很清楚,你是想問,如果將查詢結果拼接為字元串嗎?
有兩種辦法,如果是拼接為一個字元串,可以用變數,如:
DECLARE@NamesVARCHAR(MAX)
SELECT@Names=ISNULL(@Names+',','')+t.nameFROMsys.tablesASt
SELECT@Names
--返回:spt_fallback_db,spt_fallback_dev,spt_fallback_usg,spt_monitor,MSreplication_options
如果是用SQL中,可以用xml path如:
SELECTSTUFF(
(SELECT','+t.nameFROMsys.tablesAStFORXMLPATH(''))
,1,1,'')
--返回spt_fallback_db,spt_fallback_dev,spt_fallback_usg,spt_monitor,MSreplication_options
『貳』 oracle 存儲過程拼接傳參問題!
你可以拼接'to_date(' || 字元串類型日期 || 『,YYYY-MM-DD HH24:MI:SS)』 || ....
日期格式可根據需要調整
『叄』 存儲過程中的字元串拼接問題
alter proc [dbo].[fun_query_pm]
@ii_pm_name varchar(20)
as
begin
declare @where varchar(20)
begin
set @where = 'missaka'
set @where = @where + @ii_pm_name
print @where
print @ii_pm_name
end
end
exec p_test '10011'
你把char換成varchar就可以顯示了,這主要是char是固定長度,當set @where='misaka'時,
實際上@where中的位元組段已經填滿,後面空的被空格字元填滿,所以當你再進行連接的時候就沒位置連了,
當然不能連接了。用varchar就不會了
『肆』 mysql存儲過程能不能直接執行拼接的sql語句
當然可以,就是在mysql存儲過程中使用動態sql,就可以拼接sql,然後執行了。
給你復制一段,如果不滿意,自己搜索 mysql存儲過程動態sql就可以了
;
CREATEPROCEDURESearchByDoctor(
INDoctorIdVARCHAR(50),
INdeptIdVARCHAR(50),
INbeginDateVARCHAR(20),
INendDateVARCHAR(20),
INStandDeptIdVARCHAR(50),
INOperationFlagVARCHAR(50),
INSsczflIdVARCHAR(50),
OUTOperNumINT,
OUTAvgDangerIndexDOUBLE,
OUTOperGrCaseINT
)
BEGIN
DECLAREcal1VARCHAR(800);
DECLAREcal2VARCHAR(800);
SETcal1="SELECTCOUNT(1),AVG(DANGER_INDEX)INTO@para1,@para2FROMyw_ssxxbWHERE1=1";
SETcal2="SELECTCOUNT(1)INTO@para3FROMgr_grbwWHEREOPE_RELIDIN(SELECTRELIDFROMyw_ssxxbWHERE1=1";
#拼接醫生id
SETcal1=CONCAT(cal1,"","ANDOPEDOC_ID=","'",DoctorId,"'");
SETcal2=CONCAT(cal2,"","ANDOPEDOC_ID=","'",DoctorId,"'");
#拼接科室id
IFdeptId<>''THEN
SETcal1=CONCAT(cal1,"ANDDEPT_ID=","'",deptId,"'");
ENDIF;
#拼接開始結束日期
IFbeginDate<>''ANDendDate<>''THEN
SETcal1=CONCAT(cal1,"","ANDOPER_ATBETWEEN","'",beginDate,"'","AND","'",endDate,"'");
ENDIF;
#拼接標准科室
IFStandDeptId<>''THEN
SETcal1=CONCAT(cal1,"","ANDDEPT_IDIN(_DEPT_ID=","'",StandDeptId,"'",")");
ENDIF;
#拼接數據來源
IFOperationFlag<>''THEN
SETcal1=CONCAT(cal1,"","ANDOPEPARTKINDIDIN(SELECTIDFROMzh_ssczflWHEREFLAG=","'",OperationFlag,"'",")");
ENDIF;
#拼接手術操作類別
IFSsczflId<>''THEN
SETcal1=CONCAT(cal1,"","ANDOPEPARTKINDID=","'",SsczflId,"'");
ENDIF;
SETcal2=CONCAT(cal2,")");
SET@sql1=cal1;
SET@sql2=cal2;
PREPAREstmt1FROM@sql1;
EXECUTEstmt1;
DEALLOCATEPREPAREstmt1;
PREPAREstmt2FROM@sql2;
EXECUTEstmt2;
DEALLOCATEPREPAREstmt2;
SETOperNum=@para1;
SETAvgDangerIndex=@para2;
SETOperGrCase=@para3;
END;
『伍』 存儲過程拼接問題
執行語句也需要作為字元串變數拼接後執行
createorreplaceprocereemplist(enameinvarchar,empcuroutsys_refcursor)
is
v_where_ddvarchar2(10000);
sqlstrvarchar2(10000);--增加這個
begin
ifenameisnotnullthen
v_where_dd:=v_where_dd||'andename='''||ename||'''';
endif
dbms_output.put_line(v_where_dd);
sqlstr:='selectempno,enamefromempwhere1=1'||v_where_dd;--增加這個
executeimmediatesqlstr;--執行
endemplist
『陸』 我想通過存儲過程將一個表查詢出來的多行結果,拼接成一條,如何實現 1 2 3 a 1 2 3 b 拼成 1 2 3 a b
其實這個可以用sql的自連接就可以解決了,不過用存儲過程也可以,思路差不多,首先你在if或者是while中判斷前三個欄位相等,如果相等就把後面的欄位進行拼接,用函數啊concat或者是||什麼的的,有一個關鍵的地方就是在判斷裡面加一個變數,這個變數就是以前三個欄位分組得到的最大值,比如:1,2,3,a ; 1,2,3,b ; 1,2,3,c ; 1,3,4,a ; 1,3,5,b ; 1,5,4,c ,明顯1,2,3分組得到為3,這個就決定你後面拼接的長度,這里拼出來是 1,2,3,a,b,c , 而後面的幾組明顯拼出來沒有那個長度,這時就需要用上面提到的變數,來做--操作,來使後面補上『』 。 不懂再問
還有 ,我建議這種專業的問題去專業的網站論壇上問,那邊的效率比較高,而且學到的東西也多些,比如csdn,itpub。。。。
『柒』 存儲過程拼接了兩個sql,如何執行;
這個是oracle的存儲過程。你只要在執行時候輸入參數_tableName,v_pkKey ,v_pkValue 的值就行了,它會自動順序執行的。
『捌』 SQL 執行存儲過程,字元串參數如何拼接
變數直接寫,要連接字元串的話,用
||
這個符號,後面的字元串用單引號引!
例如
變數
V_str
字元串'
select
emp
from
table
where
'
連接後為:
------------------------------------------------
'
select
emp
from
table
where
'
||
V_str
------------------------------------------------
希望可以幫助到你!