一个FUNCATION哪里错了,有人帮我看看吧!

qq_30030793 2017-01-24 01:04:27

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[Fun_1] ( @table_1 varchar(10) )
RETURNS varchar(1024)

AS
BEGIN

Declare @T1_Name varchar(10)
Declare @T2_count int
set @T2_count=0

Declare cur_1 cursor
FOR select t1 from @table_1;

open cur_1;
FETCH NEXT from cur_1 into @t1_name;
select @T2_count=count(*) from @table_1 where T1=@T1_Name;
if @T2_count>1
print @t1_name;
close cur_1;
Deallocate cur_2;

RETURN @T1_Name;

END

====
出错提示如下!
Msg 1087, Level 16, State 1, Procedure Fun_1, Line 13
Must declare the table variable "@table_1".
Msg 1087, Level 16, State 1, Procedure Fun_1, Line 18
Must declare the table variable "@table_1".
...全文
681 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
道素 2017-02-04
  • 打赏
  • 举报
回复
上面我写的操作有个BUG,如果重复的行数超过两行,T1会被重复链接,可以按照下面进一步修改,增加一个判断

INSERT INTO tt
SELECT 'BB','A1' 
ALTER FUNCTION func_test
()
RETURNS VARCHAR(max)
AS
BEGIN
	DECLARE @s VARCHAR(max)
    DECLARE @t1 VARCHAR(100),@lt1 VARCHAR(100),@b bit
  --  SELECT @s=ISNULL(@s+',','')+tt.t1 FROM tt GROUP BY t1 HAVING COUNT(t2)>1  
    DECLARE cur CURSOR FOR 
    SELECT tt.t1 FROM tt ORDER BY t1 
    OPEN cur
    FETCH NEXT FROM cur INTO @t1
    WHILE @@FETCH_STATUS=0
    BEGIN
        IF @t1=@lt1 AND @b=0
        BEGIN
          SET @s=ISNULL(@s+',','')+@t1  
          SET @b=1
        END
        ELSE 
           SET @b=0
        SET @lt1=@t1
        FETCH NEXT FROM cur INTO @t1     
    END
    CLOSE cur
    DEALLOCATE cur

    RETURN @s

END
GO
道素 2017-02-04
  • 打赏
  • 举报
回复
1. function 不支持动态执行语句,所以在function可以直接使用表名(不是通过变量传入) 2.但就你的目的其实不用游标,用下面的语句就行:

CREATE TABLE tt(T1 VARCHAR(100),T2 VARCHAR(100))
INSERT INTO tt
SELECT 'AA','A3' UNION ALL
SELECT 'BB','A1' UNION ALL
SELECT 'BB','A1' UNION ALL
SELECT 'CC','A2' UNION ALL
SELECT 'DD','A1' UNION ALL
SELECT 'DD','A2'

    DECLARE @s VARCHAR(max)
    SELECT @s=ISNULL(@s+',','')+tt.t1 FROM tt GROUP BY t1 HAVING COUNT(t2)>1
    RETURN @s
如果是为了学习使用光标,可以这样试试,光标操作那部分用注释掉的一行语句也行

CREATE FUNCTION func_test
()
RETURNS VARCHAR(max)
AS
BEGIN
	DECLARE @s VARCHAR(max)
    DECLARE @t1 VARCHAR(100),@lt1 VARCHAR(100)
  --  SELECT @s=ISNULL(@s+',','')+tt.t1 FROM tt GROUP BY t1 HAVING COUNT(t2)>1  
    DECLARE cur CURSOR FOR 
    SELECT tt.t1 FROM tt ORDER BY t1 
    OPEN cur
    FETCH NEXT FROM cur INTO @t1
    WHILE @@FETCH_STATUS=0
    BEGIN
        IF @t1=@lt1 SET @s=ISNULL(@s+',','')+@t1
        SET @lt1=@t1
        FETCH NEXT FROM cur INTO @t1     
    END
    CLOSE cur
    DEALLOCATE cur

    RETURN @s

END
GO

SELECT dbo.func_test()
--BB,DD
qq_30030793 2017-01-24
  • 打赏
  • 举报
回复
我的表如下 T1 T2 --------- AA A3 BB A1 BB A1 CC A2 DD A1 DD A2 想用游标的方式,找出有T1有多条记录,并显示出来“BB, CC", 就可以了。
qq_30030793 2017-01-24
  • 打赏
  • 举报
回复
引用 7 楼 roy_88 的回复:
SELECT  t1
            FROM    @table_1; 	
数据库不支持这样的写法 只能用动态语句函数不支持,改用存储过程去调用
	EXEC('SELECT  *
            FROM    '+@table_1); 	
只用一句SQL,我会写的只要加GROUP HAVING,就可以了,但我最近在学习如何在FUNCATION中使用游标,所以,试着写了下,我希望可以显示出所有重复记录,PRINT不能用,如何解决这种问题呢?
二月十六 版主 2017-01-24
  • 打赏
  • 举报
回复
PRINT不行,用SELECT
qq_30030793 2017-01-24
  • 打赏
  • 举报
回复
只用一句SQL,我会写的只要加GROUP HAVING,就可以了,但我最近在学习如何在FUNCATION中使用游标,所以,试着写了下,我希望可以显示出所有重复记录,PRINT不能用,如何解决这种问题呢?
中国风 2017-01-24
  • 打赏
  • 举报
回复
SELECT  t1
            FROM    @table_1; 	
数据库不支持这样的写法 只能用动态语句函数不支持,改用存储过程去调用
	EXEC('SELECT  *
            FROM    '+@table_1); 	
0与1之间 2017-01-24
  • 打赏
  • 举报
回复
那你一个SQL语句就可以解决了,没必要这么麻烦 还有就是标量函数只能返回一个值,而且不能使用print
qq_30030793 2017-01-24
  • 打赏
  • 举报
回复
我其实就是想在一个表里找出有重复的记录,但我想试着用油标的方式写写看。
0与1之间 2017-01-24
  • 打赏
  • 举报
回复
那你的要求是什么?要返回什么结果?
qq_30030793 2017-01-24
  • 打赏
  • 举报
回复
能帮我改下吗?
0与1之间 2017-01-24
  • 打赏
  • 举报
回复
游标循环好像也不太对吧
0与1之间 2017-01-24
  • 打赏
  • 举报
回复
你没有声明表变量

34,593

社区成员

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

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