创建方法中如何通过变量传入表名?

兔子-顾问 2016-09-30 10:54:43

CREATE FUNCTION GetMax(@table_name varchar(50) , @column_name varchar(50))
RETURNS int
AS
Begin
Declare @max_value int
SELECT @max_value = MAX(@column_name) + 1 from @table_nam
if @max_value is not NULL return 0
Return @max_value
End


少用到数据库,这会儿需要效率,不能再DAL中添加GetMax的方法,所以写了函数,希望可以直接返回max,但似乎传入的表名table_name无法使用。

还有,判断@max_value是否是空,如果空,赋值为0。语法怎么写。谢了。

别说我要代码,多条腿走路,我发完贴就去别的地方搜索答案了。如果回头这里有答案,至少别人搜索时候可以更高的命中答案。

嗯,谢了。回帖即有分。
...全文
207 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
吉普赛的歌 版主 2016-09-30
  • 打赏
  • 举报
回复
引用 12 楼 wuyazhe 的回复:
这样看来,我还是写个存储过程,接受参数来插入吧。 c#中,我就不直接执行insert了,换调用存储过程。 这样是否是比较好了。
如何得到你想要的结果, 上面版主也讲了, 不再赘述。 但这样毕竟消耗太大, 访问量大的话不值。 遍历数据库中所有的表和列, 也没有多少条记录, 不如将所有的值先算出来, 放在下面表中: 你需要时直接从表中取就好, 效率高很多的。
CREATE TABLE dbo.tableColumnMaxValue(
	tableName VARCHAR(50) NOT NULL,
	columnName VARCHAR(50) NOT NULL,
	maxValue INT NOT NULL,
	CONSTRAINT PK_tableColumnMaxValue PRIMARY KEY(
		tableName,
		columnName
	)
)
兔子-顾问 2016-09-30
  • 打赏
  • 举报
回复
这样看来,我还是写个存储过程,接受参数来插入吧。 c#中,我就不直接执行insert了,换调用存储过程。 这样是否是比较好了。
中国风 2016-09-30
  • 打赏
  • 举报
回复
调用方法
DECLARE @table_name VARCHAR(50) ,
    @column_name VARCHAR(50) ,
    @max_value INT;
EXEC GetMax @table_name, @column_name, @max_value OUTPUT;
INSERT into TableLocation values(@max_value,1,10,20,GETDATE())
中国风 2016-09-30
  • 打赏
  • 举报
回复
引用 6 楼 wuyazhe 的回复:
[quote=引用 4 楼 roy_88 的回复:] 改为存储过程去实现 [/code]
这么多行,1秒2w次调用,会不会慢啊。[/quote] 这样最好批次调用 如:调表类型参数或XML 在执行时同一个表的多列调用一次,调用时用脏读防止被阻塞 ---------- 另一解决方法 用1个表记录要调用的对象,当对象名有记录时新增时维护对应记录最大值(不要求适时更新,可改为周期性更新此表),调用时直接缓存这个表的记录,设置好刷新缓存的时间周期 这样解决减少与数据的交互,更有效
兔子-顾问 2016-09-30
  • 打赏
  • 举报
回复
真不熟悉数据库。。。 环境:ms sql2008 r2 之后,查询分析器中使用sql插入数据报错:
insert into TableLocation values(dbo.GetMax('TableLocation','pos_id'),1,10,20,GETDATE())

消息 4121,级别 16,状态 1,第 1 行
找不到列 "dbo" 或用户定义的函数或聚合 "dbo.GetMax",或者名称不明确。
中国风 2016-09-30
  • 打赏
  • 举报
回复
函数不支持动态对象名(表名/列名) 用函数只能用CLR函数自己写DDL或存储过程处理 性能没什么影响,如果列名有单独索引的情况下性能会高,看你“+1”列类型都应该是数字,占用字节小性能影响不大
卖水果的net 版主 2016-09-30
  • 打赏
  • 举报
回复
这个需求,只能动态拼接 SQL 语句,并且要用到 sp_executesql 过程,才能返回,但是有一点不爽, sp_executesql 不能在函数中执行; 改用存储过程吧;
兔子-顾问 2016-09-30
  • 打赏
  • 举报
回复
引用 4 楼 roy_88 的回复:
改为存储过程去实现 [/code]
这么多行,1秒2w次调用,会不会慢啊。
兔子-顾问 2016-09-30
  • 打赏
  • 举报
回复
引用 3 楼 wufeng4552 的回复:
1)换存储过程 2)动态拼接 3)使用sp_executesql
1.这个小功能,调用存储过程和调用函数相比,有啥性能不同不?因为这个调用次数太多了,我数数,1秒2w次。 2.动态拼接,如果有一小段就更好了,我先试试。 3.我也试一下,多谢指点。
中国风 2016-09-30
  • 打赏
  • 举报
回复
改为存储过程去实现

CREATE PROCEDURE GetMax
    (
      @table_name VARCHAR(50) ,
      @column_name VARCHAR(50) ,
      @max_value INT = 0 OUTPUT
    )
AS
    BEGIN
        DECLARE @Sql NVARCHAR(1000);
        SET @Sql = 'SELECT @max_value = MAX(' + @column_name + ') + 1 from '
            + @table_name;
        EXEC sys.sp_executesql @Sql, N'@max_value int output',
            @max_value OUTPUT;
        IF @max_value IS  NULL
            SET @max_value = 0;	
    END;
GO

DECLARE @table_name VARCHAR(50) ,
    @column_name VARCHAR(50) ,
    @max_value INT;
EXEC GetMax @table_name, @column_name, @max_value OUTPUT;
SELECT  @max_value;
水族杰纶 2016-09-30
  • 打赏
  • 举报
回复
1)换存储过程 2)动态拼接 3)使用sp_executesql
中国风 2016-09-30
  • 打赏
  • 举报
回复
用动态语法拼字符串
兔子-顾问 2016-09-30
  • 打赏
  • 举报
回复
哦,了解了,赋值需要写个set

	IF @max_value is not NULL 
		set @max_value = 0
问题就剩下表名了。
卖水果的net 版主 2016-09-30
  • 打赏
  • 举报
回复
引用 14 楼 wuyazhe 的回复:
这个。。。最终解决了,不过没用这么复杂的办法,表的id字段弄成自增属性了。不设置,自动。不知道有啥不好没。
有时候,你想手动改一下这个值,不让改;剩下的全是好处;
兔子-顾问 2016-09-30
  • 打赏
  • 举报
回复
这个。。。最终解决了,不过没用这么复杂的办法,表的id字段弄成自增属性了。不设置,自动。不知道有啥不好没。

34,838

社区成员

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

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