调用存储过程,求写法

cjzm83 2010-06-06 11:13:19
ALTER PROC [dbo].[sp_merge_str]
@cwd VARCHAR(30),
@field VARCHAR(30),
@str VARCHAR(8000) output
AS
BEGIN
DECLARE @strsql NVARCHAR(4000)
SET @str = ''
SET @strsql = ' SELECT @str = @str + '','' + cast( ' + @field + ' as varchar) FROM dbo.t_stockin WHERE si_cciwd = ''' + @cwd + ''''
EXECUTE sp_executesql @strsql, N'@str varchar(8000) output', @str output

END

上面创建一个存储过程,下面希望这样调用

SELECT ci_cwd, ci_iNo, si_cwd_Str = (exec dbo.sp_merge_str @cwd=ci_cwd,@field='si_cwd',@str = @str output)
,si_iNO_Str = (exec dbo.sp_merge_str @cwd= ci_iNo,@field='si_ino',@str = @str output)
FROM t_commin

语法错误,该咋搞

...全文
177 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
cjzm83 2010-06-07
  • 打赏
  • 举报
回复
这个我写过了,boss要求写个通用的函数,把表名作为参数啊
htl258_Tony 2010-06-07
  • 打赏
  • 举报
回复
--> 生成测试数据表: [t_stockin]
IF OBJECT_ID('[t_stockin]') IS NOT NULL
DROP TABLE [t_stockin]
GO
CREATE TABLE [t_stockin] ([si_cwd] [nvarchar](20),[si_ino] [int],[si_cciwd] [nvarchar](20))
INSERT INTO [t_stockin]
SELECT '0709-0000159','1','0709-0000128' UNION ALL
SELECT '0709-0000159','2','0709-0000128'

--> 生成测试数据表: [t_commin]
IF OBJECT_ID('[t_commin]') IS NOT NULL
DROP TABLE [t_commin]
GO
CREATE TABLE [t_commin] ([ci_cwd] [nvarchar](20))
INSERT INTO [t_commin]
SELECT '0709-0000128'


--2005的直接查询:

SELECT *,
cwd_str=STUFF((SELECT ','+LTRIM(si_cwd) FROM [t_stockin] WHERE [si_cciwd]=t.[ci_cwd] FOR XML PATH('')),1,1,''),
into_str=STUFF((SELECT ','+LTRIM(si_ino) FROM [t_stockin] WHERE [si_cciwd]=t.[ci_cwd] FOR XML PATH('')),1,1,'')
FROM [t_commin] t
/*
ci_cwd cwd_str into_str
-------------------- ------------------------------ ------------------------------
0709-0000128 0709-0000159,0709-0000159 1,2

(1 行受影响)
*/
cjzm83 2010-06-07
  • 打赏
  • 举报
回复
假如我的表不是t_stockin,那是不是又得写一个函数啊
htl258_Tony 2010-06-07
  • 打赏
  • 举报
回复
----------------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-06-07 09:00:24
-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
-- Blog : http://blog.csdn.net/htl258
----------------------------------------------------------------------------------

--> 生成测试数据表: [t_stockin]
IF OBJECT_ID('[t_stockin]') IS NOT NULL
DROP TABLE [t_stockin]
GO
CREATE TABLE [t_stockin] ([si_cwd] [nvarchar](20),[si_ino] [int],[si_cciwd] [nvarchar](20))
INSERT INTO [t_stockin]
SELECT '0709-0000159','1','0709-0000128' UNION ALL
SELECT '0709-0000159','2','0709-0000128'

--> 生成测试数据表: [t_commin]
IF OBJECT_ID('[t_commin]') IS NOT NULL
DROP TABLE [t_commin]
GO
CREATE TABLE [t_commin] ([ci_cwd] [nvarchar](20))
INSERT INTO [t_commin]
SELECT '0709-0000128'

--SELECT * FROM [t_stockin]
--SELECT * FROM [t_commin]

-->SQL查询如下:
IF OBJECT_ID('dbo.f_str') IS NOT NULL
DROP FUNCTION dbo.f_str
GO
CREATE FUNCTION dbo.f_str
(
@si_cciwd VARCHAR(200),
@type int
)
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @str VARCHAR(1000)
SELECT @str = ISNULL(@str+',', '')
+ CASE @type
WHEN 1 THEN LTRIM(si_ino)
WHEN 2 THEN LTRIM([si_cwd])
END
FROM [t_stockin]
WHERE [si_cciwd] = @si_cciwd
RETURN @str
END
GO

SELECT *,dbo.f_str(ci_cwd,2) cwd_str,dbo.f_str(ci_cwd,1) into_str FROM [t_commin]
/*
ci_cwd cwd_str into_str
-------------------- ------------------------------ ------------------------------
0709-0000128 0709-0000159,0709-0000159 1,2

(1 行受影响)
*/
MODIFY
htl258_Tony 2010-06-07
  • 打赏
  • 举报
回复
----------------------------------------------------------------------------------
-- Author : htl258(Tony)
-- Date : 2010-06-07 09:00:24
-- Version: Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86)
-- Jul 9 2008 14:43:34
-- Copyright (c) 1988-2008 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 3)
-- Blog : http://blog.csdn.net/htl258
----------------------------------------------------------------------------------

--> 生成测试数据表: [t_stockin]
IF OBJECT_ID('[t_stockin]') IS NOT NULL
DROP TABLE [t_stockin]
GO
CREATE TABLE [t_stockin] ([si_cwd] [nvarchar](20),[si_ino] [int],[si_cciwd] [nvarchar](20))
INSERT INTO [t_stockin]
SELECT '0709-0000159','1','0709-0000128' UNION ALL
SELECT '0709-0000159','2','0709-0000128'

--> 生成测试数据表: [t_commin]
IF OBJECT_ID('[t_commin]') IS NOT NULL
DROP TABLE [t_commin]
GO
CREATE TABLE [t_commin] ([ci_cwd] [nvarchar](20))
INSERT INTO [t_commin]
SELECT '0709-0000128'

--SELECT * FROM [t_stockin]
--SELECT * FROM [t_commin]

-->SQL查询如下:
IF OBJECT_ID('dbo.f_str') IS NOT NULL
DROP FUNCTION dbo.f_str
GO
CREATE FUNCTION dbo.f_str
(
@si_cciwd VARCHAR(20),
@type int
)
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @str VARCHAR(1000)
SELECT @str = ISNULL(@str+',', '')
+ CASE @type
WHEN 1 THEN LTRIM(si_ino)
WHEN 2 THEN LTRIM([si_cciwd])
END
FROM [t_stockin]
WHERE [si_cciwd] = @si_cciwd
RETURN @str
END
GO

SELECT *,dbo.f_str(ci_cwd,1) [si_ino],dbo.f_str(ci_cwd,2) [si_cciwd] FROM [t_commin]
/*
ci_cwd si_ino si_cciwd
-------------------- ---------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------
0709-0000128 1,2 0709-0000128,0709-0000128

(1 行受影响)
*/
cjzm83 2010-06-07
  • 打赏
  • 举报
回复
表t_stockin

si_cwd si_ino si_cciwd
0709-0000159 1 0709-0000128
0709-0000159 2 0709-0000128


表t_commin
ci_cwd
0709-0000128


结果
ci_cwd cwd_str ino_str
0709-0000128 0709-0000159,0709-0000159 1,2

现在就是表名(如t_stockin可能是其他表)是动态的,表中字段自然也是动态的,一开是我想写成函数,但函数不能执行动态sql
该为存储过程调用又出了问题
htl258_Tony 2010-06-07
  • 打赏
  • 举报
回复
请楼主提供:
--测试数据:



--想要的结果:



我们帮你写代码。
cjzm83 2010-06-07
  • 打赏
  • 举报
回复
我要存储过程执行动态sql,然后在select 中调用,楼上有什么变通的方法。上面几位给的代码不符合要求啊
永生天地 2010-06-07
  • 打赏
  • 举报
回复
存储过程不能用该select里
函数中又不能 执行动态sql。

ShenLiang2025 2010-06-07
  • 打赏
  • 举报
回复



--1)存储过程
DROP PROC [dbo].[sp_merge_str]
Go
CREATE PROC [dbo].[sp_merge_str]
@cwd VARCHAR(30),
@field VARCHAR(30)
AS
BEGIN
DECLARE @strsql NVARCHAR(4000)
DECLARE @str VARCHAR(8000)
SET @str = ''
SET @strsql = ' SELECT @str = ISNULL(@str + '','','''') + cast( ' + @field + ' as varchar) FROM dbo.a_b WHERE aid = ''' + @cwd + ''''
EXECUTE sp_executesql @strsql, N'@str varchar(8000) output', @str output
SELECT merge_str = SUBSTRING(@str,2,LEN(@str)-1),aid = @cwd
END

--2)a_b相关数据

SELECT * FROM a_b

aID bID
---------- -----------
01 10
02 20
02 30
01 20
01 30

(5 row(s) affected)

--3)执行
EXEC sp_merge_str
@cwd = '01',
@field ='bid'

--4)结果
merge_str aid
10,20,30 01

(1 row(s) affected)



wqmgxj 2010-06-06
  • 打赏
  • 举报
回复

create function sp_merge_str(@cwd VARCHAR(30),@field VARCHAR(30))
return VARCHAR(8000)
AS
BEGIN
DECLARE @strsql NVARCHAR(4000)
SET @str = ''
SELECT @str = @str + ',' + cast( @field as varchar) FROM dbo.t_stockin WHERE si_cciwd = @cwd
set @str=right(@str,len(@str)-1)
return(@str)
END



SELECT ci_cwd, ci_iNo, = dbo.sp_merge_str(ci_cwd,'si_cwd') as si_cwd_Str
,dbo.sp_merge_str (ci_iNo,'si_ino' ) as si_iNO_Str
FROM t_commin

cjzm83 2010-06-06
  • 打赏
  • 举报
回复
函数里不能调用exec
Invalid use of a side-effecting operator 'EXECUTE STRING' within a function.
wqmgxj 2010-06-06
  • 打赏
  • 举报
回复
create function [dbo].[sp_merge_str]
@cwd VARCHAR(30),
@field VARCHAR(30)
@str VARCHAR(8000) output
AS
BEGIN
DECLARE @strsql NVARCHAR(4000)
SET @str = ''
SET @strsql = ' SELECT @str = @str + '','' + cast( ' + @field + ' as varchar) FROM dbo.t_stockin WHERE si_cciwd = ''' + @cwd + ''''
exec(@strsql)
END



SELECT ci_cwd, ci_iNo, = dbo.sp_merge_str(ci_cwd,'si_cwd') as si_cwd_Str
,dbo.sp_merge_str (ci_iNo,'si_ino' ) as si_iNO_Str
FROM t_commin

wqmgxj 2010-06-06
  • 打赏
  • 举报
回复
函数可能有问题,在精华里找一下。
wqmgxj 2010-06-06
  • 打赏
  • 举报
回复

create function [dbo].[sp_merge_str]
@cwd VARCHAR(30),
@field VARCHAR(30)
AS
BEGIN
DECLARE @strsql NVARCHAR(4000)
SET @str = ''
SET @strsql = ' SELECT @str = @str + '','' + cast( ' + @field + ' as varchar) FROM dbo.t_stockin WHERE si_cciwd = ''' + @cwd + ''''
exec(@strsql)
END



SELECT ci_cwd, ci_iNo, = dbo.sp_merge_str(ci_cwd,'si_cwd') as si_cwd_Str
,dbo.sp_merge_str (ci_iNo,'si_ino' ) as si_iNO_Str
FROM t_commin
cjzm83 2010-06-06
  • 打赏
  • 举报
回复
一开始我是用函数的,但在函数里不能调存储过程吧,
这句话
EXECUTE sp_executesql @strsql, N'@str varchar(8000) output', @str output
报错
wqmgxj 2010-06-06
  • 打赏
  • 举报
回复
改为函数,存储过程不能当函数用

34,594

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧