创建以 TableName 为参数的存储过程

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。谢谢

Aar*_*and 6

在这个设计中,有些东西看起来真的、真的、真的很糟糕。

  1. 你真的有大量的表有一个名为 的列Internet吗?那一栏甚至是什么意思?
  2. 您是否真的要调用此存储过程以更新指定表中的每一行?为什么?您没有为每个地点/城市/房间准备一个单排表,是吗?为什么?

无论如何,您的代码中存在一些问题;如果您不能考虑完全重新设计,请允许我建议重写。

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)

相关链接: