存储过程中的表名怎么用变量代替

时间:2021-08-07 19:53:48
Create Procedure  [dbo].[pro1]
 @ T1 char(20),T2 char(20)
AS
    select * from @T1 
    left @T2
   on  @T1.id=@T2.id
RETURN
以上表名可以用变量代替吗,如果可以怎么使用?

12 个解决方案

#1


大概这样:
/*

CREATE TABLE test1
(id INT )
CREATE TABLE test2
(id INT)

INSERT INTO test1 
VALUES(1)

INSERT INTO test2
VALUES(1)
*/

alter Procedure  [dbo].[pro1]
 @T1 varchar(20),
 @T2 varchar(20)
AS
DECLARE @sql varchar(max)
SET @sql='select * from '+ QUOTENAME(@T1) +' left join '+ QUOTENAME(@T2) +' on  '+QUOTENAME(@T1)+'.id='+QUOTENAME(@T2) +'.id'
EXEC( @sql)
go

EXEC pro1 'test1','test2'


/*
id          id
----------- -----------
1           1

*/

#2



使用动态语句

CREATE PROCEDURE  [dbo].[pro1]
@ T1 CHAR(20),T2 CHAR(20)
AS
    EXECUTE('select * from '+@T1+ 
    'left join '+@T2+
   'on  '+@T1+'.id='+@T2+'.id');
END  

#3


存储过程是在sql2000里建立,使用'+@变量+'做表名,不好用

#4


不好用???

#5



USE [wed]
GO
/****** 对象:  StoredProcedure [dbo].[Duty_pro_total_times]    脚本日期: 07/15/2014 13:46:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- 创建存储过程
ALTER Proc [dbo].[Duty_pro_total_times]
-- 存储过程参数
@Tb_duty_kind varchar(50),@Tp_table varchar(50),@from_datetime datetime,@to_datetime datetime,@str_days char(20)
AS
-- 存储过程语句体
DECLARE @sql varchar(100)
Set @sql=(select Isnull(sum(G1.s_day),0),Isnull(G2.duty_10days,0) ,sum(G3.man_number), 
Isnull(sum(G5.s_day1),0),Isnull(sum(G6.s_day2),0) from
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day from dt_dep D
            Left Join 
            (select S.m_id, sum(S.perday) as s_day from 
             V_s as S 
             where  (S.j_mark='1' or S.j_mark='2')  and  
            S.RQ>=@from_datetime and RQ<=@to_datetime group by S.m_id ) H 
             on D.dep_serial=H.m_id) G1 
Left Join  
(select aa.teams,count(duty_kind) as duty_10days from   '+@Tb_duty_kind+' aa 
      inner join  '+@Tp_table+' bb on aa.duty_date=bb.RQ where aa.duty_kind='' and 
      bb.RQ>=@from_datetime and bb.RQ<=@to_datetime group by aa.teams) G2 
on G1.dep_serial=G2.teams 
left join 
(select m_id,man_number from Tb_dep_number_month 
        where month=@str_days) G3 on G1.dep_serial=G3.m_id 
left join 
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day1 from dt_dep D 
           Left Join 
          (select S.m_id, sum(S.perday) as s_day1 from 
           V_s as S 
           where  S.j_mark='1'   and  S.RQ>=@from_datetime and RQ<=@to_datetime group by S.m_id ) H 
           on D.dep_serial=H.m_id) G5
on G1.dep_serial=G5.dep_serial 
left join 
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day2 from dt_dep D 
           Left Join 
          (select S.m_id, sum(S.perday) as s_day2 from 
            V_s as S 
           where   S.j_mark='2'  and  S.RQ>=@from_datetime and RQ<=@to_datetime group by S.m_id ) H
           on D.dep_serial=H.m_id) G6
on G1.dep_serial=G6.dep_serial
where G1.dep_serial<>'8'
group by G2.duty_10days)
Exec(@sql)
return
-- 执行

#6


消息 170,级别 15,状态 1,过程 Duty_pro_total_times,第 18 行
第 18 行: '+@Tb_duty_kind+' 附近有语法错误。
消息 170,级别 15,状态 1,过程 Duty_pro_total_times,第 24 行
第 24 行: 'G3' 附近有语法错误。
消息 170,级别 15,状态 1,过程 Duty_pro_total_times,第 31 行
第 31 行: 'G5' 附近有语法错误。
消息 170,级别 15,状态 1,过程 Duty_pro_total_times,第 39 行
第 39 行: 'G6' 附近有语法错误。

#7


Use dynamic SQL
ALTER PROC [dbo].[Duty_pro_total_times]
-- 存储过程参数
    @Tb_duty_kind VARCHAR(50) ,
    @Tp_table VARCHAR(50) ,
    @from_datetime DATETIME ,
    @to_datetime DATETIME ,
    @str_days CHAR(20)
AS -- 存储过程语句体
    DECLARE @sql VARCHAR(MAX)
    SET @sql = '(select Isnull(sum(G1.s_day),0),Isnull(G2.duty_10days,0) ,sum(G3.man_number), 
Isnull(sum(G5.s_day1),0),Isnull(sum(G6.s_day2),0) from
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day from dt_dep D
            Left Join 
            (select S.m_id, sum(S.perday) as s_day from 
             V_s as S 
             where  (S.j_mark=''1'' or S.j_mark=''2'')  and  
            S.RQ>=@from_datetime and RQ<=@to_datetime group by S.m_id ) H 
             on D.dep_serial=H.m_id) G1 
Left Join  
(select aa.teams,count(duty_kind) as duty_10days from  ' + @Tb_duty_kind
        + ' aa 
      inner join ' + @Tp_table
        + ' bb on aa.duty_date=bb.RQ where aa.duty_kind='' and 
      bb.RQ>=@from_datetime and bb.RQ<=@to_datetime group by aa.teams) G2 
on G1.dep_serial=G2.teams 
left join 
(select m_id,man_number from Tb_dep_number_month 
        where month=@str_days) G3 on G1.dep_serial=G3.m_id 
left join 
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day1 from dt_dep D 
           Left Join 
          (select S.m_id, sum(S.perday) as s_day1 from 
           V_s as S 
           where  S.j_mark=''1''   and  S.RQ>=@from_datetime and RQ<=@to_datetime group by S.m_id ) H 
           on D.dep_serial=H.m_id) G5
on G1.dep_serial=G5.dep_serial 
left join 
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day2 from dt_dep D 
           Left Join 
          (select S.m_id, sum(S.perday) as s_day2 from 
            V_s as S 
           where   S.j_mark=''2''  and  S.RQ>=@from_datetime and RQ<=@to_datetime group by S.m_id ) H
           on D.dep_serial=H.m_id) G6
on G1.dep_serial=G6.dep_serial
where G1.dep_serial<>''8''
group by G2.duty_10days)'
    EXEC(@sql)

#8


消息 170,级别 15,状态 1,过程 Duty_pro_total_times,第 7 行
第 7 行: 'Max' 附近有语法错误。
消息 170,级别 15,状态 1,过程 Duty_pro_total_times,第 30 行
第 30 行: '1' 附近有语法错误。
消息 137,级别 15,状态 2,过程 Duty_pro_total_times,第 43 行
必须声明变量 '@sql'。

#9


declare @name
declare @str
set @name=table

set @str =('select * from @name")
exec(@str)

#10


这个能编译通过,最后面的EXEC是我的测试例子而已,你可以删掉。看来你都没接触过动态SQL 啊?再改几次我都快吐血了。。。
alter PROC [dbo].[Duty_pro_total_times]
-- 存储过程参数
    @Tb_duty_kind VARCHAR(50) ,
    @Tp_table VARCHAR(50) ,
    @from_datetime DATETIME ,
    @to_datetime DATETIME ,
    @str_days CHAR(20)
AS -- 存储过程语句体
    DECLARE @sql VARCHAR(MAX)
    SET @sql = 'select Isnull(sum(G1.s_day),0),Isnull(G2.duty_10days,0) ,sum(G3.man_number), 
Isnull(sum(G5.s_day1),0),Isnull(sum(G6.s_day2),0) from
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day from dt_dep D
            Left Join 
            (select S.m_id, sum(S.perday) as s_day from 
             V_s as S 
             where  (S.j_mark=''1'' or S.j_mark=''2'')  and  
            S.RQ>='''+CAST(@from_datetime as varchar(30))+''' and RQ<='''+CAST(@to_datetime as varchar(30))+''' group by S.m_id ) H 
             on D.dep_serial=H.m_id) G1 
Left Join  
(select aa.teams,count(duty_kind) as duty_10days from  ' + QUOTENAME(@Tb_duty_kind)
        + ' aa 
      inner join ' + QUOTENAME(@Tp_table)
        + ' bb on aa.duty_date=bb.RQ where aa.duty_kind='''' and 
      bb.RQ>='''+CAST(@from_datetime as varchar(30))+''' and bb.RQ<='''+CAST(@to_datetime as varchar(30))+''' group by aa.teams) G2 
on G1.dep_serial=G2.teams 
left join 
(select m_id,man_number from Tb_dep_number_month 
        where month='''+CAST(@str_days as varchar(30))+''') G3 on G1.dep_serial=G3.m_id 
left join 
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day1 from dt_dep D 
           Left Join 
          (select S.m_id, sum(S.perday) as s_day1 from 
           V_s as S 
           where  S.j_mark=''1''   and  S.RQ>='''+CAST(@from_datetime as varchar(30))+''' and RQ<='''+CAST(@to_datetime as varchar(30))+''' group by S.m_id ) H 
           on D.dep_serial=H.m_id) G5
on G1.dep_serial=G5.dep_serial 
left join 
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day2 from dt_dep D 
           Left Join 
          (select S.m_id, sum(S.perday) as s_day2 from 
            V_s as S 
           where   S.j_mark=''2''  and  S.RQ>='''+CAST(@from_datetime  as varchar(30))+''' and RQ<='''+CAST(@to_datetime as varchar(30))+''' group by S.m_id ) H
           on D.dep_serial=H.m_id) G6
on G1.dep_serial=G6.dep_serial
where G1.dep_serial<>''8''
group by G2.duty_10days'
    EXEC  (@sql)
go

EXEC [Duty_pro_total_times] '1','a','2014-01-01','2014-01-02','1'

#11


是这样的,我在本机上连接其他电脑上的SQL
连接sql2005并在查询里建立存储过程,上面的语句能执行,没错误
但是..连接sql2000后,并在查询里建立存储过程,上面的语句就出现如下错误
第 10 行: 'MAX' 附近有语法错误。
消息 137,级别 15,状态 1,过程 Duty_pro_total_times,第 47 行
必须声明变量 '@sql'。
消息 137,级别 15,状态 2,过程 Duty_pro_total_times,第 47 行
必须声明变量 '@sql'。

#12


alter PROC [dbo].[Duty_pro_total_times]
-- 存储过程参数
    @Tb_duty_kind VARCHAR(50) ,
    @Tp_table VARCHAR(50) ,
    @from_datetime DATETIME ,
    @to_datetime DATETIME ,
    @str_days CHAR(20)
AS -- 存储过程语句体
     DECLARE @sql VARCHAR(MAX)2000只有varchar(8000),把max改成8000

#1


大概这样:
/*

CREATE TABLE test1
(id INT )
CREATE TABLE test2
(id INT)

INSERT INTO test1 
VALUES(1)

INSERT INTO test2
VALUES(1)
*/

alter Procedure  [dbo].[pro1]
 @T1 varchar(20),
 @T2 varchar(20)
AS
DECLARE @sql varchar(max)
SET @sql='select * from '+ QUOTENAME(@T1) +' left join '+ QUOTENAME(@T2) +' on  '+QUOTENAME(@T1)+'.id='+QUOTENAME(@T2) +'.id'
EXEC( @sql)
go

EXEC pro1 'test1','test2'


/*
id          id
----------- -----------
1           1

*/

#2



使用动态语句

CREATE PROCEDURE  [dbo].[pro1]
@ T1 CHAR(20),T2 CHAR(20)
AS
    EXECUTE('select * from '+@T1+ 
    'left join '+@T2+
   'on  '+@T1+'.id='+@T2+'.id');
END  

#3


存储过程是在sql2000里建立,使用'+@变量+'做表名,不好用

#4


不好用???

#5



USE [wed]
GO
/****** 对象:  StoredProcedure [dbo].[Duty_pro_total_times]    脚本日期: 07/15/2014 13:46:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- 创建存储过程
ALTER Proc [dbo].[Duty_pro_total_times]
-- 存储过程参数
@Tb_duty_kind varchar(50),@Tp_table varchar(50),@from_datetime datetime,@to_datetime datetime,@str_days char(20)
AS
-- 存储过程语句体
DECLARE @sql varchar(100)
Set @sql=(select Isnull(sum(G1.s_day),0),Isnull(G2.duty_10days,0) ,sum(G3.man_number), 
Isnull(sum(G5.s_day1),0),Isnull(sum(G6.s_day2),0) from
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day from dt_dep D
            Left Join 
            (select S.m_id, sum(S.perday) as s_day from 
             V_s as S 
             where  (S.j_mark='1' or S.j_mark='2')  and  
            S.RQ>=@from_datetime and RQ<=@to_datetime group by S.m_id ) H 
             on D.dep_serial=H.m_id) G1 
Left Join  
(select aa.teams,count(duty_kind) as duty_10days from   '+@Tb_duty_kind+' aa 
      inner join  '+@Tp_table+' bb on aa.duty_date=bb.RQ where aa.duty_kind='' and 
      bb.RQ>=@from_datetime and bb.RQ<=@to_datetime group by aa.teams) G2 
on G1.dep_serial=G2.teams 
left join 
(select m_id,man_number from Tb_dep_number_month 
        where month=@str_days) G3 on G1.dep_serial=G3.m_id 
left join 
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day1 from dt_dep D 
           Left Join 
          (select S.m_id, sum(S.perday) as s_day1 from 
           V_s as S 
           where  S.j_mark='1'   and  S.RQ>=@from_datetime and RQ<=@to_datetime group by S.m_id ) H 
           on D.dep_serial=H.m_id) G5
on G1.dep_serial=G5.dep_serial 
left join 
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day2 from dt_dep D 
           Left Join 
          (select S.m_id, sum(S.perday) as s_day2 from 
            V_s as S 
           where   S.j_mark='2'  and  S.RQ>=@from_datetime and RQ<=@to_datetime group by S.m_id ) H
           on D.dep_serial=H.m_id) G6
on G1.dep_serial=G6.dep_serial
where G1.dep_serial<>'8'
group by G2.duty_10days)
Exec(@sql)
return
-- 执行

#6


消息 170,级别 15,状态 1,过程 Duty_pro_total_times,第 18 行
第 18 行: '+@Tb_duty_kind+' 附近有语法错误。
消息 170,级别 15,状态 1,过程 Duty_pro_total_times,第 24 行
第 24 行: 'G3' 附近有语法错误。
消息 170,级别 15,状态 1,过程 Duty_pro_total_times,第 31 行
第 31 行: 'G5' 附近有语法错误。
消息 170,级别 15,状态 1,过程 Duty_pro_total_times,第 39 行
第 39 行: 'G6' 附近有语法错误。

#7


Use dynamic SQL
ALTER PROC [dbo].[Duty_pro_total_times]
-- 存储过程参数
    @Tb_duty_kind VARCHAR(50) ,
    @Tp_table VARCHAR(50) ,
    @from_datetime DATETIME ,
    @to_datetime DATETIME ,
    @str_days CHAR(20)
AS -- 存储过程语句体
    DECLARE @sql VARCHAR(MAX)
    SET @sql = '(select Isnull(sum(G1.s_day),0),Isnull(G2.duty_10days,0) ,sum(G3.man_number), 
Isnull(sum(G5.s_day1),0),Isnull(sum(G6.s_day2),0) from
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day from dt_dep D
            Left Join 
            (select S.m_id, sum(S.perday) as s_day from 
             V_s as S 
             where  (S.j_mark=''1'' or S.j_mark=''2'')  and  
            S.RQ>=@from_datetime and RQ<=@to_datetime group by S.m_id ) H 
             on D.dep_serial=H.m_id) G1 
Left Join  
(select aa.teams,count(duty_kind) as duty_10days from  ' + @Tb_duty_kind
        + ' aa 
      inner join ' + @Tp_table
        + ' bb on aa.duty_date=bb.RQ where aa.duty_kind='' and 
      bb.RQ>=@from_datetime and bb.RQ<=@to_datetime group by aa.teams) G2 
on G1.dep_serial=G2.teams 
left join 
(select m_id,man_number from Tb_dep_number_month 
        where month=@str_days) G3 on G1.dep_serial=G3.m_id 
left join 
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day1 from dt_dep D 
           Left Join 
          (select S.m_id, sum(S.perday) as s_day1 from 
           V_s as S 
           where  S.j_mark=''1''   and  S.RQ>=@from_datetime and RQ<=@to_datetime group by S.m_id ) H 
           on D.dep_serial=H.m_id) G5
on G1.dep_serial=G5.dep_serial 
left join 
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day2 from dt_dep D 
           Left Join 
          (select S.m_id, sum(S.perday) as s_day2 from 
            V_s as S 
           where   S.j_mark=''2''  and  S.RQ>=@from_datetime and RQ<=@to_datetime group by S.m_id ) H
           on D.dep_serial=H.m_id) G6
on G1.dep_serial=G6.dep_serial
where G1.dep_serial<>''8''
group by G2.duty_10days)'
    EXEC(@sql)

#8


消息 170,级别 15,状态 1,过程 Duty_pro_total_times,第 7 行
第 7 行: 'Max' 附近有语法错误。
消息 170,级别 15,状态 1,过程 Duty_pro_total_times,第 30 行
第 30 行: '1' 附近有语法错误。
消息 137,级别 15,状态 2,过程 Duty_pro_total_times,第 43 行
必须声明变量 '@sql'。

#9


declare @name
declare @str
set @name=table

set @str =('select * from @name")
exec(@str)

#10


这个能编译通过,最后面的EXEC是我的测试例子而已,你可以删掉。看来你都没接触过动态SQL 啊?再改几次我都快吐血了。。。
alter PROC [dbo].[Duty_pro_total_times]
-- 存储过程参数
    @Tb_duty_kind VARCHAR(50) ,
    @Tp_table VARCHAR(50) ,
    @from_datetime DATETIME ,
    @to_datetime DATETIME ,
    @str_days CHAR(20)
AS -- 存储过程语句体
    DECLARE @sql VARCHAR(MAX)
    SET @sql = 'select Isnull(sum(G1.s_day),0),Isnull(G2.duty_10days,0) ,sum(G3.man_number), 
Isnull(sum(G5.s_day1),0),Isnull(sum(G6.s_day2),0) from
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day from dt_dep D
            Left Join 
            (select S.m_id, sum(S.perday) as s_day from 
             V_s as S 
             where  (S.j_mark=''1'' or S.j_mark=''2'')  and  
            S.RQ>='''+CAST(@from_datetime as varchar(30))+''' and RQ<='''+CAST(@to_datetime as varchar(30))+''' group by S.m_id ) H 
             on D.dep_serial=H.m_id) G1 
Left Join  
(select aa.teams,count(duty_kind) as duty_10days from  ' + QUOTENAME(@Tb_duty_kind)
        + ' aa 
      inner join ' + QUOTENAME(@Tp_table)
        + ' bb on aa.duty_date=bb.RQ where aa.duty_kind='''' and 
      bb.RQ>='''+CAST(@from_datetime as varchar(30))+''' and bb.RQ<='''+CAST(@to_datetime as varchar(30))+''' group by aa.teams) G2 
on G1.dep_serial=G2.teams 
left join 
(select m_id,man_number from Tb_dep_number_month 
        where month='''+CAST(@str_days as varchar(30))+''') G3 on G1.dep_serial=G3.m_id 
left join 
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day1 from dt_dep D 
           Left Join 
          (select S.m_id, sum(S.perday) as s_day1 from 
           V_s as S 
           where  S.j_mark=''1''   and  S.RQ>='''+CAST(@from_datetime as varchar(30))+''' and RQ<='''+CAST(@to_datetime as varchar(30))+''' group by S.m_id ) H 
           on D.dep_serial=H.m_id) G5
on G1.dep_serial=G5.dep_serial 
left join 
(select dep_serial,convert(nvarchar(50),dep_name) as dep_name,H.s_day2 from dt_dep D 
           Left Join 
          (select S.m_id, sum(S.perday) as s_day2 from 
            V_s as S 
           where   S.j_mark=''2''  and  S.RQ>='''+CAST(@from_datetime  as varchar(30))+''' and RQ<='''+CAST(@to_datetime as varchar(30))+''' group by S.m_id ) H
           on D.dep_serial=H.m_id) G6
on G1.dep_serial=G6.dep_serial
where G1.dep_serial<>''8''
group by G2.duty_10days'
    EXEC  (@sql)
go

EXEC [Duty_pro_total_times] '1','a','2014-01-01','2014-01-02','1'

#11


是这样的,我在本机上连接其他电脑上的SQL
连接sql2005并在查询里建立存储过程,上面的语句能执行,没错误
但是..连接sql2000后,并在查询里建立存储过程,上面的语句就出现如下错误
第 10 行: 'MAX' 附近有语法错误。
消息 137,级别 15,状态 1,过程 Duty_pro_total_times,第 47 行
必须声明变量 '@sql'。
消息 137,级别 15,状态 2,过程 Duty_pro_total_times,第 47 行
必须声明变量 '@sql'。

#12


alter PROC [dbo].[Duty_pro_total_times]
-- 存储过程参数
    @Tb_duty_kind VARCHAR(50) ,
    @Tp_table VARCHAR(50) ,
    @from_datetime DATETIME ,
    @to_datetime DATETIME ,
    @str_days CHAR(20)
AS -- 存储过程语句体
     DECLARE @sql VARCHAR(MAX)2000只有varchar(8000),把max改成8000