use*_*054 -1 sql-server stored-procedures
我正在尝试创建一个存储过程,其中将表名作为参数传递,并更新表的内容。这是我到目前为止的代码。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE TableSelect
@TableName varchar(100)
AS
BEGIN
SET NOCOUNT ON;
Declare @String varchar(100)
SELECT @String = 'Update '
SELECT @String = @String + @TableName
SELECT @String = @String + 'Set Internet = 1'
EXEC (@String)
END
GO
Run Code Online (Sandbox Code Playgroud)
当我尝试通过此命令执行时:
EXEC TableSelect 'Waterford';
Run Code Online (Sandbox Code Playgroud)
我收到错误:
Msg 102, Lvevl 15, State 1, Line 1
Incorrect syntax near 'Internet'.
Run Code Online (Sandbox Code Playgroud)
任何帮助都会很棒。仅供参考,互联网专栏,有点像 0/1 或 False/True。谢谢
在这个设计中,有些东西看起来真的、真的、真的很糟糕。
Internet吗?那一栏甚至是什么意思?无论如何,您的代码中存在一些问题;如果您不能考虑完全重新设计,请允许我建议重写。
ALTER PROCEDURE dbo.TableSelect -- always use schema prefix!
@TableName NVARCHAR(512) -- this must be a Unicode data type!
AS
BEGIN
SET NOCOUNT ON;
-- should at least validate that the @TableName is valid
-- which can at least somewhat help avoid SQL injection
IF OBJECT_ID(@TableName) IS NULL
BEGIN
RETURN;
END
DECLARE @String NVARCHAR(4000);-- should always use Unicode here too
-- and always use semi-colons
SET @String = N'Update ' + @TableName + N' Set Internet = 1';
-- needed a space here ---------------^
-- which PRINT @String would have shown you.
EXEC sys.sp_executesql @String;
-- sp_executesql preferred over EXEC()
END
GO
Run Code Online (Sandbox Code Playgroud)
现在,当你调用它时,在两个地方也指定架构,并指定参数名称,例如:
EXEC dbo.TableSelect @TableName = N'dbo.Waterford';
Run Code Online (Sandbox Code Playgroud)
相关链接: