日期:2014-05-18  浏览次数:20431 次

一个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)
AS
BEGIN
DECLARE @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;
END
GO





------解决方案--------------------
楼主可以使用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;