存储过程拼接
你的问题,问的不是很清楚,你是想问,如果将查询结果拼接为字符串吗?
有两种办法,如果是拼接为一个字符串,可以用变量,如:
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
------------------------------------------------
希望可以帮助到你!