动态SQL中返回数值

最近在做一个paypal抓取数据的程序,由于所有字段和paypal之间存在对应映射的关系,所以所有的sql语句必须得拼接传到存储过程里去执行,

ALTER proc [dbo].[sp_common_paypal_AddInfo]
(
 @paypalsql varchar(max),--不包含用户表的paypalsql语句
 @paypalusersql varchar(max),--paypal用户表的sql语句
 @ebaysql varchar(max),--不包含用户表的ebaysql语句
 @ebayusersql varchar(max),--ebay的用户表sql语句
 @paypaluserwhere varchar(max),--paypal用户表查询ID语句
 @ebayuserwhere varchar(max),--ebay用户表查询ID语句
 @websql varchar(max),--web除去用户表的sql语句
 @webusersql varchar(max),--web用户表的sql语句
 @webwhere varchar(max),--web用户表where之后的sql语句
 @ebaystockflag varchar(10),--ebay订单号生成规则
 @webstockflag varchar(10)--web订单号生成规则
)
as
set xact_abort on
begin transaction mytrans
begin try
declare @uid int--根据语句查找用户ID
declare @execsql varchar(max)
declare @ebayuid int--根据语句查找用户ID
declare @execebaysql nvarchar(max)--用sp_executesql 字段类型必须是nvarchar
declare @sql nvarchar(max)--用sp_executesql 字段类型必须是nvarchar
set @sql='select @a=ID from  tb_TransactionCustomer where '+ convert(varchar(8000),@paypaluserwhere)
exec   sp_executesql   @sql,N'@a int output',@uid   output  
set   @uid =ISNULL(@uid,0)--如果不这样判断 获取的值可能为null用len()获取不到长度

--存在paypal用户id
if(@uid>0)
begin
set @execsql=@paypalsql-- 存在用户信息
set @execsql= REPLACE(@execsql,'@uid',''+convert(varchar,@uid)+'')
end
else
begin
set @execsql=@paypalusersql+@paypalsql --不存在用户信息
end

if(LEN(@websql)>0)--执行web语句
begin
exec sp_common_WebSiteorder_AddInfo @websql, @webusersql, @webwhere ,@webstockflag
end
if(LEN(@ebaysql)>0)--执行ebay语句
begin
--exec sp_common_Ebay_AddInfo @ebaysql, @ebayusersql, @ebayuserwhere ,@ebaystockflag
SELECT * FROM tb_EbayOrder WITH (TABLOCKX)
SELECT *  FROM tb_EbayOrderList WITH (TABLOCKX) 
SELECT * FROM tb_EbayOrderUserInfo WITH (TABLOCKX)
set @sql='select @b=ID from  tb_EbayOrderUserInfo where '+ convert(varchar(8000),@ebayuserwhere)
exec   sp_executesql   @sql,N'@b int output',@ebayuid   output  
set   @ebayuid =ISNULL(@ebayuid,0)
if(@ebayuid>0)
begin
set @execebaysql=@ebaysql--存在ebayuid
set @execebaysql= REPLACE(@execebaysql,'@ebayuid',''+convert(varchar,@ebayuid)+'')--必须替换 否则会报错误说必须声明标量变量
end
else
begin
set @execebaysql=@ebayusersql+@ebaysql --不存在ebayuid
end
set @execebaysql= REPLACE(@execebaysql,'@00',dbo.GetOrderNum(@ebaystockflag))--调用函数替换订单编号
exec (@execebaysql)

end
exec(@execsql)

end try
begin catch
if(@@TRANCOUNT>0)
rollback transaction mytrans

end catch
if(@@TRANCOUNT>0)
begin
 commit transaction mytrans
 
end
else begin
rollback transaction mytrans

 end


 

转载于:https://www.cnblogs.com/zhang9418hn/archive/2011/12/03/2253533.html

在Oracle SQL中,可以利用某些函数将汉字转换为对应的数值表示形式。这种操作通常涉及将字符编码转化为数字、计算Unicode值等场景。 ### 使用 `ASCII` 和 `UNICODE` 如果需要获取单个汉字的Unicode码点,则可以尝试使用 **`UNICODE()`** 函数: ```sql SELECT UNICODE('汉') FROM dual; ``` 上述语句会返回“汉”字所对应 Unicode 编码值(十进制)。不过请注意,并非所有数据库版本均支持该函数;对于那些不直接提供 `UNICODE()` 的环境来说,还可以通过其他途径间接达成目标。 另外一种常见做法就是借助字符串处理功能手动解析多字节序列并映射到整数范围上。 例如下面这个例子展示如何逐位读取UTF8格式存储下的每个组成单位然后再拼接起来形成最终结果: ```sql WITH chars AS ( SELECT LEVEL pos, SUBSTR(UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW('E6B197')),LEVEL,1) ch -- '汉' FROM DUAL CONNECT BY LEVEL <= LENGTH(UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW('E6B197'))) ) SELECT LISTAGG( ASCII(ch), '' ) WITHIN GROUP (ORDER BY pos) ascii_str FROM chars; ``` 此脚本首先把指定汉字按其内部二进制表达拆分成独立部分,接着分别求出各自的ASCII码再组合成完整串型输出。 当然,在实际项目里应该选择更高效简洁的方式完成类似任务。比如若只是单纯想得到某个特定字符的位置信息,则可以直接运用内置工具如 INSTR() 来查找定位即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值