首页 新闻 会员 周边 捐助

sql 自定义函数传参

0
悬赏园豆:100 [已解决问题] 解决于 2012-03-26 10:18

 可以传表名么?

Create FUNCTION [dbo].[RecursionChildList]--创建一个递归父子表结构为(ID,NAME,PID)的函数
(
@PID int,--传入父级ID
@TableName varchar(50),--传入查询表名称
@IsShowParent bit --是否插入父级
)
RETURNS @T TABLE(ID VARCHAR(10),Name VARCHAR(50),PARENTID VARCHAR(10),LEVEL INT)
AS
BEGIN

DECLARE @INDEX INT
SET @INDEX=1

IF @IsShowParent=TRUE
BEGIN
INSERT INTO @T SELECT ID,NAME,PARENTID FROM @TableName WHERE ID=@PID --插入当前级别
END

INSERT INTO @T SELECT ID,NAME,PARENTID,@INDEX FROM @TableName WHERE PARENTID=@PID--插入PID下一级的数据

---如果本级
WHILE @@ROWCOUNT>0
BEGIN
SET @INDEX=@INDEX+1
INSERT INTO @T SELECT T1.ID,T1.NAME,T1.PARENTID,@INDEX FROM @TableName T1,@T T2
WHERE T1.PARENTID=T2.ID AND T2.LEVEL=@INDEX-1
END
RETURN

END

服务器: 消息 137,级别 15,状态 2,过程 RecursionChildList,行 16
必须声明变量 '@TableName'。
服务器: 消息 137,级别 15,状态 1,过程 RecursionChildList,行 19
必须声明变量 '@TableName'。
服务器: 消息 137,级别 15,状态 1,过程 RecursionChildList,行 25
必须声明变量 '@TableName'。

求解决

天蓝若空的主页 天蓝若空 | 初学一级 | 园豆:9
提问于:2012-03-23 16:19
< >
分享
最佳答案
0

可以把sql语句赋给一个变量 比如 

SET @sql='insert into table1 .....'
然后
exec @sql
就可以了
收获园豆:100
死白的man | 老鸟四级 |园豆:2135 | 2012-03-23 16:27
其他回答(2)
0

表名,列名要动态,参考动态SQL

happydaily | 园豆:260 (菜鸟二级) | 2012-03-23 20:29
0

实在不知道怎么用函数解决,同学说用存储过程可以解决 于是在园子里搜索了下,感谢园子里的朋友们。

CREATE PROCEDURE pro_RecursionChildList
(
@PID int,--传入父级ID
@TableName varchar(50),--传入查询表名称
@IsShowParent bit --是否插入父级
)AS

DECLARE @INDEX INT
CREATE TABLE #T (ID VARCHAR(10),Name VARCHAR(50),PARENTID VARCHAR(10),LEVEL INT)
SET @INDEX=1
IF @IsShowParent=1
BEGIN
EXEC('INSERT INTO #T SELECT ID,NAME,PARENTID,0 FROM '+ @TableName+' WHERE ID='+@PID) --插入当前级别
END
EXEC('INSERT INTO #T SELECT ID,NAME,PARENTID, '+@INDEX+' FROM '+@TableName+' WHERE PARENTID = '+@PID)--插入PID下一级的数据

WHILE @@ROWCOUNT>0
BEGIN
SET @INDEX=@INDEX+1
EXEC('INSERT INTO #T SELECT T1.ID,T1.NAME,T1.PARENTID, '+@INDEX+' FROM '+ @TableName+' T1,#T
WHERE T1.PARENTID= #T.ID AND #T.LEVEL=
'+@INDEX+' -1')
END

SELECT * FROM #T
GO
天蓝若空 | 园豆:9 (初学一级) | 2012-03-26 10:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册