我正在尝试编写带有两个参数的存储过程。一个是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
此过程返回“无效列名”(在输入表名称处)错误。我无法找到这个中的错误。任何帮助将不胜感激。在此先感谢。
答案 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()
将仅返回当前连接中最后生成的标识。