这个表名的变量该怎么写呢?
create PROCEDURE usp_GetBillNo(
@BillNo varchar(20) output,
@tablename char(50),
@fieldname VARCHAR(50),
@billtype char(1),
@shop_id char(2),
@today char(6))
AS
declare @maxbillno varchar(10)
SELECT @maxbillno=max(substring(@fieldname,10,len(@fieldname)-9))
FROM [@tablename]
where substring(@fieldname,2,2)=@shop_id and substring(@fieldname,4,6)=@today
FROM [@tablename] 可以通过,运行的时候说:对象名 '@tablename' 无效。
FROM @tablename 不能通过
我要将表名作为参数,该如何写呢?
问题点数:20、回复次数:7Top
1 楼wanyingsong(豌豆)回复于 2004-09-02 10:58:01 得分 0
用动态语句,execTop
2 楼mastersky(浪)回复于 2004-09-02 10:59:18 得分 0
怎么写好呢Top
3 楼zjcxc(邹建)回复于 2004-09-02 11:02:57 得分 20
create PROCEDURE usp_GetBillNo(
@BillNo varchar(20) output,
@tablename char(50),
@fieldname VARCHAR(50),
@billtype char(1),
@shop_id char(2),
@today char(6))
AS
declare @s nvarchar(4000) --注意类型
declare @maxbillno varchar(10)
set @s='
SELECT @maxbillno=max(substring(['+@fieldname+'],10,len(['+@fieldname+'])-9))
FROM ['+@tablename+']
where substring(['+@fieldname+'],2,2)=@shop_id and substring(['+@fieldname+'],4,6)=@today'
exec sp_executesql @s
,N'@billtype char(1),
@shop_id char(2),
@today char(6)),
@maxbillno varchar(10) out'
,@billtype,@shop_id,@today,@maxbillno out
set @BillNo=@maxbillno --应该还要返回结果吧?
Top
4 楼popmailzjw(什麼都不會)回复于 2004-09-02 11:07:58 得分 0
表名是不能作为参数直接在SQL中出现的,只用能EXEC执行字符串语句时在字符串中加入表名Top
5 楼yown(yong)回复于 2004-09-02 11:14:56 得分 0
你看看 sp_executesql ,当然没问题的喽Top
6 楼mastersky(浪)回复于 2004-09-02 11:29:18 得分 0
搞定了,全过程是这样的。谢谢各位了
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
if Exists (Select name From sysobjects
WHERE name = 'usp_GetBillNo' AND type = 'P')
drop proc usp_GetBillNo
GO
create PROCEDURE usp_GetBillNo(
@BillNo varchar(20) output,
@tablename char(50),
@fieldname VARCHAR(50),
@billtype char(1),
@shop_id char(2),
@today char(6))
AS
declare @s nvarchar(4000)
declare @maxbillno varchar(10)
set @s='
SELECT @maxbillno=max(substring(['+@fieldname+'],10,len(['+@fieldname+'])-9))
FROM ['+@tablename+']
where substring(['+@fieldname+'],2,2)=@shop_id and substring(['+@fieldname+'],4,6)=@today'
exec sp_executesql @s
,N'@maxbillno varchar(10) out,
@shop_id char(2),
@today char(6)'
,@maxbillno out,@shop_id,@today
if @maxbillno=''
begin
set @maxbillno='1'
end
else begin
set @maxbillno=convert(char(10),convert(int,@maxbillno)+1)
end
if Len(@maxbillno)=1
set @maxbillno='000'+@maxbillno
else if Len(@maxbillno)=2
set @maxbillno='00'+@maxbillno
else if Len(@maxbillno)=3
set @maxbillno='0'+@maxbillno
set @billno=@billtype+@shop_id+@today+@maxbillno
print @billno
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Top
7 楼mastersky(浪)回复于 2004-09-02 11:33:26 得分 0
我给了: zjcxc(邹建) 20分,怎么看不到得分?Top




