我正在尝试将表A中的所有记录插入到表B中。表A存在,表B不存在。
这是我的存储过程。此代码有效,但仅限于固定的表名表B:
USE [myDatabaseName]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[myStoreProcedureFileName]
AS
BEGIN
SELECT *
INTO tableB
FROM tableA
END
然而,我想把tableB作为一个变量,这样我就可以从C#代码中传递它,这不起作用,请帮助:
ALTER PROCEDURE [dbo].[myStoreProcedureFileName]
@tableName varchar(32)
AS
BEGIN
SELECT *
INTO @tableName
FROM tableA
END
请提供帮助-为什么SQL Server无法识别选择行中的@tableName
?解决方案?
您需要使用动态SQL:
ALTER PROCEDURE [dbo].[myStoreProcedureFileName] (
@tableName varchar(32)
) AS
BEGIN
DECLARE @sql NVARCHAR(MAX) = 'SELECT * into @tableName from tableA';
SET @sql = REPLACE(@sql, '@tableName', @tableName);
EXEC sp_executesql @sql;
END;
参数只能替换SQL语句中的常量。它们不能替换标识符、运算符、函数名或关键字。
您必须使用动态SQL
declare @sql nvarchar(max);
set @sql = N'select * into ' + @tableName + N' from tableA';
exec sp_executesql @sql;