新足迹

 找回密码
 注册

精华好帖回顾

· 大头怀念的北京小吃(五) --幼滑豌豆黄 (2007-12-19) datou2z · 〖毛家每日私房菜〗 No.2 → 发面糖饼 (2005-6-27) qianqian
· Secret (2013-9-25) braindev · 云台纠结中 (2009-5-1) dickson
Advertisement
Advertisement
查看: 1581|回复: 22

T-SQL 小白问题: UDF中可以call STORED PROC吗? [复制链接]

发表于 2011-6-23 11:07 |显示全部楼层
此文章由 Dan.and.Andy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Dan.and.Andy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
看起来不能,放狗有人说可能,但是没有下文。sql server 2005 中有办法work around吗?
Advertisement
Advertisement

发表于 2011-6-23 11:13 |显示全部楼层
此文章由 LoveAu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 LoveAu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
好像是可以call extended sp, 不知道是否可以 call user sp.

发表于 2011-6-23 11:13 |显示全部楼层
此文章由 ccj5124 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 ccj5124 所有!转贴必须注明作者、出处和本声明,并保持内容完整
UDF 是什么

发表于 2011-6-23 11:14 |显示全部楼层

回复 ccj5124 3# 帖子

此文章由 xxmplus 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 xxmplus 所有!转贴必须注明作者、出处和本声明,并保持内容完整
user defined funciton

发表于 2011-6-23 11:19 |显示全部楼层
此文章由 Dan.and.Andy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Dan.and.Andy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 LoveAu 于 2011-6-23 11:13 发表
好像是可以call extended sp, 不知道是否可以 call user sp.


都不可以,我实验了。parse 可以通过,run的时候就出错了。

发表于 2011-6-23 11:21 |显示全部楼层

为什么要这么干?

此文章由 混不到坑的萝卜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 混不到坑的萝卜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
一般是不行的,当然也有hacky way,不过我实在不建议。
具体就是把那个stored proc放在一个script file里面,然后用xp_cmpshell去eval。你可以放狗搜一下。不过这种方式实在是失去了原有的意义,因为你不方便传参数进去。
Advertisement
Advertisement

发表于 2011-6-23 11:21 |显示全部楼层
此文章由 LoveAu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 LoveAu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
查了一下2008 BOL, execute statements calling extended stored procedures. 应该是可以的。

发表于 2011-6-23 11:24 |显示全部楼层
此文章由 混不到坑的萝卜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 混不到坑的萝卜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 LoveAu 于 2011-6-23 11:21 发表
查了一下2008 BOL, execute statements calling extended stored procedures. 应该是可以的。

这个可以,但LZ应该是想问一般的stored proc而不是managed code。

参与宝库编辑功臣

发表于 2011-6-23 11:25 |显示全部楼层
此文章由 bffbffbff 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bffbffbff 所有!转贴必须注明作者、出处和本声明,并保持内容完整
正常是不能的,不过放狗能找到些歪招,

http://www.sqlservercentral.com/Forums/Topic308097-145-1.aspx

发表于 2011-6-23 11:26 |显示全部楼层
此文章由 LoveAu 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 LoveAu 所有!转贴必须注明作者、出处和本声明,并保持内容完整
But, the extended stored procedure, when it is called from inside a function, can not returen result sets to the client.

参与宝库编辑功臣

发表于 2011-6-23 11:27 |显示全部楼层
此文章由 bffbffbff 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bffbffbff 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 混不到坑的萝卜 于 2011-6-23 11:21 发表
一般是不行的,当然也有hacky way,不过我实在不建议。
具体就是把那个stored proc放在一个script file里面,然后用xp_cmpshell去eval。你可以放狗搜一下。不过这种方式实在是失去了原有的意义,因为你不方便传参数进去。


对,没啥意思都是些偏门,call proc这类事情就去找proc做
永远的junior programmer
Advertisement
Advertisement

发表于 2011-6-23 11:28 |显示全部楼层
此文章由 北风 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 北风 所有!转贴必须注明作者、出处和本声明,并保持内容完整
其实一般你不需要这个问题的答案
理解一下function和stored proc的定义和用处

发表于 2011-6-23 11:33 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
agree楼上, 不值得这样做

发表于 2011-6-23 11:34 |显示全部楼层
此文章由 Dan.and.Andy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Dan.and.Andy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我的现实情况是,一个field里存的都是xml,有上百万条的样子,先人创造的历史原因的记录。现在我写report,用sp取出来,有个node 是时间,我要按照时间做为参数取出来,tsql 处理xml你们都知道是sp,但是 sp中调用sp当然可以,但是sp不能在select里exec,所以每次都要遍历一下这百万级的记录,效率可想而知,有解决办法吗?

发表于 2011-6-23 11:45 |显示全部楼层
此文章由 混不到坑的萝卜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 混不到坑的萝卜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你是什么SQL Server版本?

可以把Query xml的结果存入一个temp table,然后对这个temp table操作吧?

发表于 2011-6-23 11:51 |显示全部楼层
此文章由 Dan.and.Andy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Dan.and.Andy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 混不到坑的萝卜 于 2011-6-23 11:45 发表
你是什么SQL Server版本?

可以把Query xml的结果存入一个temp table,然后对这个temp table操作吧?


2005. 这个temp table 也是百万级的,而且也在增长,潜在的还是隐患
Advertisement
Advertisement

发表于 2011-6-23 11:56 |显示全部楼层

如果是这样的话

此文章由 混不到坑的萝卜 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 混不到坑的萝卜 所有!转贴必须注明作者、出处和本声明,并保持内容完整
我可能会用一个partitioned table来管理这样大型的增长型数据,用时间或者其他make sense的key column来partition这个表。当然这些就进入DBA的范畴了……

是不是还可以考虑建一个scheduled task去把这个巨大的表整理到一个甚至几个temp table里去(de-normalization, split the original table into multiple tables),每次你都直接去query这个cached table instead?

当然行不行你还是从你的需求来考虑,问问architect

[ 本帖最后由 混不到坑的萝卜 于 2011-6-23 11:58 编辑 ]

发表于 2011-6-23 12:03 |显示全部楼层
此文章由 Dan.and.Andy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Dan.and.Andy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 混不到坑的萝卜 于 2011-6-23 11:56 发表
我可能会用一个partitioned table来管理这样大型的增长型数据,用时间或者其他make sense的key column来partition这个表。当然这些就进入DBA的范畴了……

是不是还可以考虑建一个scheduled task去把这个巨大的表整理 ...


握手,这正是我想说的,谢谢

参与宝库编辑功臣

发表于 2011-6-23 12:08 |显示全部楼层
此文章由 bffbffbff 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bffbffbff 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 Dan.and.Andy 于 2011-6-23 11:34 发表
我的现实情况是,一个field里存的都是xml,有上百万条的样子,先人创造的历史原因的记录。现在我写report,用sp取出来,有个node 是时间,我要按照时间做为参数取出来,tsql 处理xml你们都知道是sp,但是 sp中调用sp当然可以,但是sp不能在select里exec,所以每次都要遍历一下这百万级的记录,效率可想而知,有解决办法吗?



tsql 处理xml你们都知道是sp? 什么意思?

udf一样可以parse @xml 数据并return scalar或者table的结果,如果数据量过大query比较大的话, 建议用table function, 用scalar UDF 有时候会 downgrade performance。
永远的junior programmer

发表于 2011-6-23 12:11 |显示全部楼层
此文章由 Dan.and.Andy 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 Dan.and.Andy 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 bffbffbff 于 2011-6-23 12:08 发表



tsql 处理xml你们都知道是sp? 什么意思?

udf一样可以parse @xml 数据并return scalar或者table的结果,如果数据量过大query比较大的话, 建议用table function, 用scalar UDF 有时候会 downgrade performance。


这个就是我想要的,能给个例子吗?谢谢

发表于 2011-6-23 12:12 |显示全部楼层
此文章由 乱码 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 乱码 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 Dan.and.Andy 于 2011-6-23 11:34 发表
我的现实情况是,一个field里存的都是xml,有上百万条的样子,先人创造的历史原因的记录。现在我写report,用sp取出来,有个node 是时间,我要按照时间做为参数取出来,tsql 处理xml你们都知道是sp,但是 sp中调用sp当然可以,但是sp不能在select里exec,所以每次都要遍历一下这百万级的记录,效率可想而知,有解决办法吗?


如果只是历史数据,跟online/core part of business, 你考虑把xml转化成table吧,作一下data migration.
Advertisement
Advertisement

发表于 2011-6-23 12:29 |显示全部楼层
此文章由 典 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 典 所有!转贴必须注明作者、出处和本声明,并保持内容完整
可以直接查询XML里边的数据,
不太理解为什么一定要SP处理XML
我这里有一行代码,其中roi_data就是xml field

select invoice_no,isnull(roi_data.value('(ROI/@est_profit)[1]','decimal'),0) profit from invoice where roi_data is not null

当然同意同学们的看法,如果只是报表,可以建立一些中间层,先把XML数据处理好

[ 本帖最后由 典 于 2011-6-23 12:32 编辑 ]

评分

参与人数 1积分 +3 收起 理由
Dan.and.Andy + 3 正解!加分

查看全部评分

参与宝库编辑功臣

发表于 2011-6-23 12:52 |显示全部楼层
此文章由 bffbffbff 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 bffbffbff 所有!转贴必须注明作者、出处和本声明,并保持内容完整
原帖由 Dan.and.Andy 于 2011-6-23 12:11 发表


这个就是我想要的,能给个例子吗?谢谢


写了个简单的例子,试试这个好用不?

CREATE FUNCTION [dbo].[Oursteps_XMLUDFTest]
(@xml        xml )
returns @temp Table
(
        Optional varchar(200)
)
as
begin
               
        insert into @temp
                select
        section.value('@optional', 'varchar(200)') as Optional       
        from
        @xml.nodes('//sections/section') sections(section)

        return
end


declare @xml  xml

select @xml = N' <sections>
   <section optional="1">first</section>
   <section optional="3">second</section>
   <section optional="4">last</section>
    </sections>'

       
select *
from dbo.dcf_Statistics_Report_Template_ParseXML(@xml)

评分

参与人数 1积分 +3 收起 理由
Dan.and.Andy + 3 太感谢了

查看全部评分

永远的junior programmer

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部