读书人

一个SQL函数的有关问题。大神们速度进

发布时间: 2012-05-22 18:18:54 作者: rapoo

一个SQL函数的问题。。。大神们速度进!江湖救急
我在写一个SQL函数,比如函数为xxx 通过xxx(表名,表字段,字符串)的格式,我得到一个当前最新的编号,然后给施工单自动进行编号。在数据里实现,如: select xxx(business,number,'GD') 如果当前business表当前月份的编号排到GD12(04)-0233了,那么我这个函数直接返回 GD12(04)-0234
以下是SQL代码

SQL code
ALTER FUNCTION [dbo].[GETBUSINESSNUMBER](@TABLENAME VARCHAR(50),@FILEDNAME VARCHAR(50),@STR VARCHAR(10))--第一个参数为表明,第二个参数为字段名,第三个参数为一个字符串,如GD。RETURNS VARCHAR(100)ASBEGINDECLARE @NUMBER VARCHAR(100);--声明一个最终返回值的变量DECLARE @YEAS VARCHAR(10);--当前年DECLARE @MOTH VARCHAR(10);--当前月DECLARE @S INT;--中间变量SET @YEAS=RIGHT(DATENAME(yy,GETDATE()),2);--得到年SET @MOTH=DATENAME(mm,GETDATE());--得到月SET @NUMBER=@STR+@YEAS+'('+@MOTH+')-';--得到一个字符串 如 GD12(04)- 这样的DECLARE @SQLSTR VARCHAR(300);--声明一个变量的SQL语句,SET @SQLSTR='SELECT @S=MAX(RIGHT('+@FILEDNAME+',4)) FROM '+QUOTENAME(@TABLENAME);SET @SQLSTR=@SQLSTR+' WHERE LEFT('+@FILEDNAME+',9)='+''''+@NUMBER+'''';--这里是对SQL语句进行拼接,查询到所在表的最大编号。EXEC @SQLSTR;--这里来执行。注意不是EXEC(@sqlstr),这样会报错,不知道为什么--SELECT @S=MAX(RIGHT(@FILEDNAME,4)) FROM @TABLENAME WHERE @FILEDNAME=@NUMBER;--为什么我不用上面屏蔽掉的这一句,直接简单,我发觉会报一个让声明表变量的错误。因为@TABLENAME是传入的一个字符串,结果就好比--SELECT * FROM 'CUSTOMER'一样,会报错,没找到解决方法SET @NUMBER=@NUMBER+dbo.PadLeft(STR(@S+1),'0',4);--这里是另外一个补白的函数 ,如返回88 转换橙0088.RETURN @NUMBER;ENDGO




[解决办法]
楼主可以使用profile跟踪一下,看最终执行的sql是什么,看该sql是否有问题
[解决办法]
SELECT @S=MAX(RIGHT(CC_NUMBER,4)) FROM [Construction] WHERE LEFT(CC_NUMBER,9)='GD12(04)-'

执行有问题吗?
[解决办法]
使用sp_executesql
[解决办法]
SQL code
DECLARE @IntVariable int;DECLARE @SQLString nvarchar(500);DECLARE @ParmDefinition nvarchar(500);DECLARE @max_title varchar(30);SET @IntVariable = 197;SET @SQLString = N'SELECT @max_titleOUT = max(JobTitle)    FROM AdventureWorks2012.HumanResources.Employee   WHERE BusinessEntityID = @level';SET @ParmDefinition = N'@level tinyint, @max_titleOUT varchar(30) OUTPUT';EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @max_titleOUT=@max_title OUTPUT;SELECT @max_title; 

读书人网 >SQL Server

热点推荐