none
SQL的问题 RRS feed

  • 问题

  • 存储过程如下:
    ALTER PROCEDURE [dbo].[TEST]
    AS
    BEGIN
     declare @TEMP table
     (
      [NAME] nvarchar(50),
      AGE INT,
      [MONEY] money
     )

     INSERT INTO @TEMP([NAME],AGE,[MONEY]) VALUES('A',10,1000)
     INSERT INTO @TEMP([NAME],AGE,[MONEY]) VALUES('B',20,2000)

     EXEC('SELECT * FROM @TEMP')
     
    END


    然后执行这个存储过程:EXEC dbo.TEST
    会报错:必须声明表变量 "@TEMP"。


    我必须用存储过程,而且过程中必须用@TEMP和EXEC语句,遇到这种问题怎么解决?

    2009年10月30日 3:56

答案

  • ALTER PROCEDURE [dbo].[TEST]
    AS
    BEGIN
     declare @TEMP table
     (
      [NAME] nvarchar(50),
      AGE INT,
      [MONEY] money
     )

     INSERT INTO @TEMP([NAME],AGE,[MONEY]) VALUES('A',10,1000)
     INSERT INTO @TEMP([NAME],AGE,[MONEY]) VALUES('B',20,2000)

    select * from @TEMP
     --EXEC('SELECT * FROM @TEMP')
     
    END
    go

    在语句中定义的临时表无法在exec中使用 可以用 #table 临时表实现

    ALTER PROCEDURE [dbo].[TEST]
    AS
    BEGIN
     create table #TEMP
     (
      [NAME] nvarchar(50),
      AGE INT,
      [MONEY] money
     )

     INSERT INTO #TEMP([NAME],AGE,[MONEY]) VALUES('A',10,1000)
     INSERT INTO #TEMP([NAME],AGE,[MONEY]) VALUES('B',20,2000)

     
     Exec('SELECT * FROM #TEMP')
     drop table #TEMP
    END
    go
    exec dbo.TEST


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://blog.tanging.net
    • 已标记为答案 m s 2009年11月2日 5:54
    2009年10月30日 4:10
  • IF NOT OBJECT_ID('TestProc') IS NULL 
        DROP PROC TestProc
    GO
    
    CREATE PROC TestProc
    AS 
    BEGIN
    EXEC ('
        DECLARE @TEMP TABLE (
            [NAME] NVARCHAR(50)
          , AGE INT
          , [MONEY] MONEY )
    
        INSERT  INTO @TEMP ( [NAME], AGE, [MONEY] ) VALUES ( ''A'', 10, 1000 )
        INSERT  INTO @TEMP ( [NAME], AGE, [MONEY] ) VALUES ( ''B'', 20, 2000 )
    
        SELECT * FROM    @TEMP ')
     
    END
    
    GO
    
    EXEC TestProc


    知识改变命运,奋斗成就人生!
    • 已标记为答案 m s 2009年11月2日 5:54
    2009年10月30日 5:43
  • 作用域不同,在你声明的 SQL 字符串中没有对  @TEMP 的声明,要么你在 exec 执行的字符串中加上对 @Temp 的声明如上,要么使用临时表或物理如,下面已给出方式。
    知识改变命运,奋斗成就人生!
    • 已建议为答案 JerrynetModerator 2009年11月2日 2:18
    • 取消建议作为答案 m s 2009年11月2日 5:55
    • 已标记为答案 m s 2009年11月2日 5:55
    2009年10月30日 5:46

全部回复

  • IF NOT OBJECT_ID('TestProc') IS NULL 
        DROP PROC TestProc
    GO
    
    CREATE PROC TestProc
    AS 
    BEGIN
        DECLARE @TEMP TABLE (
            [NAME] NVARCHAR(50)
          , AGE INT
          , [MONEY] MONEY )
    
        INSERT  INTO @TEMP ( [NAME], AGE, [MONEY] )
        VALUES  ( 'A', 10, 1000 )
        INSERT  INTO @TEMP ( [NAME], AGE, [MONEY] )
        VALUES  ( 'B', 20, 2000 )
    
        SELECT * FROM    @TEMP -- 这里直接使用就好了
     
    END
    
    GO
    
    EXEC TestProc

    知识改变命运,奋斗成就人生!
    2009年10月30日 4:07
  • ALTER PROCEDURE [dbo].[TEST]
    AS
    BEGIN
     declare @TEMP table
     (
      [NAME] nvarchar(50),
      AGE INT,
      [MONEY] money
     )

     INSERT INTO @TEMP([NAME],AGE,[MONEY]) VALUES('A',10,1000)
     INSERT INTO @TEMP([NAME],AGE,[MONEY]) VALUES('B',20,2000)

    select * from @TEMP
     --EXEC('SELECT * FROM @TEMP')
     
    END
    go

    在语句中定义的临时表无法在exec中使用 可以用 #table 临时表实现

    ALTER PROCEDURE [dbo].[TEST]
    AS
    BEGIN
     create table #TEMP
     (
      [NAME] nvarchar(50),
      AGE INT,
      [MONEY] money
     )

     INSERT INTO #TEMP([NAME],AGE,[MONEY]) VALUES('A',10,1000)
     INSERT INTO #TEMP([NAME],AGE,[MONEY]) VALUES('B',20,2000)

     
     Exec('SELECT * FROM #TEMP')
     drop table #TEMP
    END
    go
    exec dbo.TEST


    Wenn ich dich hab’,gibt es nichts, was unerträglich ist.坚持不懈!http://blog.tanging.net
    • 已标记为答案 m s 2009年11月2日 5:54
    2009年10月30日 4:10
  • EXEC('SELECT * FROM @TEMP')
    我必须拼出一个语句,'SELECT * FROM @TEMP'只是一个假设
    2009年10月30日 4:39
  • IF NOT OBJECT_ID('TestProc') IS NULL 
        DROP PROC TestProc
    GO
    
    CREATE PROC TestProc
    AS 
    BEGIN
    EXEC ('
        DECLARE @TEMP TABLE (
            [NAME] NVARCHAR(50)
          , AGE INT
          , [MONEY] MONEY )
    
        INSERT  INTO @TEMP ( [NAME], AGE, [MONEY] ) VALUES ( ''A'', 10, 1000 )
        INSERT  INTO @TEMP ( [NAME], AGE, [MONEY] ) VALUES ( ''B'', 20, 2000 )
    
        SELECT * FROM    @TEMP ')
     
    END
    
    GO
    
    EXEC TestProc


    知识改变命运,奋斗成就人生!
    • 已标记为答案 m s 2009年11月2日 5:54
    2009年10月30日 5:43
  • 作用域不同,在你声明的 SQL 字符串中没有对  @TEMP 的声明,要么你在 exec 执行的字符串中加上对 @Temp 的声明如上,要么使用临时表或物理如,下面已给出方式。
    知识改变命运,奋斗成就人生!
    • 已建议为答案 JerrynetModerator 2009年11月2日 2:18
    • 取消建议作为答案 m s 2009年11月2日 5:55
    • 已标记为答案 m s 2009年11月2日 5:55
    2009年10月30日 5:46
  • 先多怀疑是人的问题,再怀疑是SQL的问题,呵
    Try SQL Server 2008 QQ:315054403 dgdba@hotmail.com
    2009年10月30日 9:58