Sql server 带2个参数的SQL Server过程-为什么不工作?

Sql server 带2个参数的SQL Server过程-为什么不工作?,sql-server,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 *

我已经完成了教程中的所有工作:

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,16级状态1,程序检查差异,第3行[批次开始第25行] 必须声明表变量@table1


同样的错误,重复了几次

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

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

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

这个过程应该适合您。它不起作用的原因是上面留下的评论

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

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

您正在将@table1声明为字符串变量它不是不能从字符串变量中选择的表SQL Server不支持宏替换。您需要为此使用动态sql。它正在查找一个名为@table1、@table2的表,但该表不存在。使用动态SQL。您正在将@table1声明为字符串变量,而不是不能从字符串变量中选择的表SQL Server不支持宏替换。您需要为此使用动态sql。它正在查找一个名为@table1、@table2的表,但该表不存在。使用动态SQL。至少你真的应该在quotename中包装变量以帮助防止SQL注入。至少你真的应该在quotename中包装变量以帮助防止SQL注入。