带有2个参数的SQL Server过程 - 为什么不起作用?

时间:2018-05-09 16:35:20

标签: sql-server

我已完成教程中的所有操作:

CREATE PROCEDURE dbo.checkDiff 
     @table1 NVARCHAR(50), 
     @table2 NVARCHAR(50)
AS
    SELECT * 
    FROM @table1 
    EXCEPT 
    SELECT * 
    FROM @table2
    UNION ALL
    SELECT * 
    FROM @table2 
    EXCEPT
    SELECT * 
    FROM @table1
go

但我收到了一些错误:

  

Msg 1087,Level 16 State 1,Procedure checkDiff,Line 3 [Batch Start Line 25]
  必须声明表变量“@ table1”。

同样的错误,多次重复

1 个答案:

答案 0 :(得分:3)

此程序应该适合您。它不起作用的原因是由于上面留下的评论。

CREATE PROCEDURE dbo.checkDiff (
    @table1 nvarchar(50),
    @table2 nvarchar(50)
)

AS

Declare @SQL nvarchar(max)

SET @SQL = 'select * from ' + QUOTENAME(@table1) + ' except select * from ' + QUOTENAME(@table2) + '
    union all
    select * from ' + QUOTENAME(@table2) + ' except select * from ' + QUOTENAME(@table1)

    -- PRINT @SQL
    exec sp_executesql @SQL
go

请注意,这是比较两个表中数据的一种非常糟糕的方法。两个表中的每一个都需要具有完全相同的列数才能正常工作,否则联合将失败。