我在写一个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 @[email protected][email protected]+'([email protected]+')-';--得到一个字符串 如 GD12(04)- 这样的DECLARE @SQLSTR VARCHAR(300);--声明一个变量的SQL语句,SET @SQLSTR='SELECT @S=MAX(RIGHT([email protected]+',4)) FROM '+QUOTENAME(@TABLENAME);SET @[email protected]+' WHERE LEFT([email protected]+',9)[email protected]+'''';--这里是对SQL语句进行拼接,查询到所在表的最大编号。EXEC @SQLSTR;--这里来执行。注意不是EXEC(@sqlstr),这样会报错,不知道为什么--SELECT @S=MAX(RIGHT(@FILEDNAME,4)) FROM @TABLENAME WHERE @[email protected];--为什么我不用上面屏蔽掉的这一句,直接简单,[email protected]ME是传入的一个字符串,结果就好比--SELECT * FROM 'CUSTOMER'一样,会报错,没找到解决方法SET @[email protected]+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 = [email protected] tinyint, @max_titleOUT varchar(30) OUTPUT';EXECUTE sp_executesql @SQLString, @ParmDefinition, @level = @IntVariable, @[email protected]_title OUTPUT;SELECT @max_title;