在SQL Server存储过程中插入@tablename

时间:2013-12-06 16:38:33

标签: sql-server stored-procedures

我正在尝试编写带有两个参数的存储过程。一个是Identity列,另一个是Name(可能是表名)

表格结构

    ColumnName    DataType
    ----------------------
    ID            BIGINT
    TableName     VARCHAR(100)

我写的存储过程是

    CREATE PROCEDURE [dbo].[SET_TABLE_VAL] 

@TableName VARCHAR(100),
@ID BIGINT OUTPUT   
    AS
    BEGIN

DECLARE @TableQuery NVARCHAR(MAX)
DECLARE @Table VARCHAR(100)

SET @Table = @TableName

SET @TableQuery = 'INSERT INTO @Table(TableName)VALUES(@TableName)'

    SELECT @TableQuery = REPLACE(@TableQuery,'@Table',@TableName)
    SELECT @TableQuery = REPLACE(@TableQuery,'@TableName',@TableName)
SET @ID = @@IDENTITY

EXEC(@TableQuery)

    END 

此过程返回“无效列名”(在输入表名称处)错误。我无法找到这个中的错误。任何帮助将不胜感激。在此先感谢。

2 个答案:

答案 0 :(得分:3)

试试这个......

SET @TableQuery = 'INSERT INTO @Table(TableName)VALUES(''@TableName'')'

你也可以删除

DECLARE @Table VARCHAR(100)
SET @Table = @ProjectName

因为它没有被使用。

答案 1 :(得分:0)

更清洁,更安全的方法就是这样......

CREATE PROCEDURE [dbo].[SET_TABLE_VAL]
@TableName VARCHAR(100),     --<-- I would use nvarchar(128) the maximum lenght
@ID BIGINT OUTPUT               -- a table name can be 
AS
BEGIN

DECLARE @TableQuery NVARCHAR(MAX)


SET @TableQuery = N'INSERT INTO @Table(TableName) VALUES(@TableName) '
                 + N'SET @ID = SCOPE_IDENTITY(); '


EXECUTE sp_executesql @TableQuery
                     , N'@TableName VARCHAR(100), @ID BIGINT OUTPUT'
                     , @TableName , @ID OUTPUT

END

@@ IDENTITY与SCOPE_IDENTITY()

@@IDENTITY将在任何连接中返回此表的最后生成的标识号,SCOPE_IDENTITY()将仅返回当前连接中最后生成的标识。

相关问题