在 SQL Server Management Studio 中创建存储过程时出现语法错误

Posted

技术标签:

【中文标题】在 SQL Server Management Studio 中创建存储过程时出现语法错误【英文标题】:Syntax error with creating a stored procedure in SQL Server Management Studio 【发布时间】:2020-07-06 05:10:34 【问题描述】:

目前,我正在开发一个库存系统,该系统将允许客户自定义他们自己的 SQL Server 表。

用户将为其列命名,然后指定他们想要使用的数据类型。在他们对他们的表格感到满意后,他们点击提交表格按钮来创建他们的表格。然后,C# 将通过运行 SQL Server 存储过程为用户创建一个唯一的表。

SqlConnection connection = new SqlConnection(Constants.conn);
connection.Open();

string query = "EXEC CreateTable @TableName='"+ UserAccountInfo.Username + "InventoryTable'";

SqlCommand command = new SqlCommand(query, connection);
command.ExecuteReader();

然后使用 foreach 循环,通过查看堆栈面板“StackTable”子项,遍历添加的每一列(UserTable 类是我的自定义 WPF UserControl),并将 Usertable“Name”和“DataType”的属性分配给字符串数组列表。然后我遍历整个列表并执行第二个存储过程来更改先前创建的表。

我相信这一切都会奏效!!我的问题和问题在于我的存储过程。

List<string[]> list = new List<string[]>();

foreach (UserTable ut in StackTable.Children)

    string dataType = "";

    switch (ut.DataType.Text)
    
        case "Text": dataType = "Varchar(100)"; break;
        case "Number": dataType = "INT"; break;
        case "Boolean": dataType = "Varchar(5)"; break;
    

    string[] vs = "[" + ut.Name.Text + "]", dataType;
    list.Add(vs);


foreach (string[] s in list)

    string query2 = "EXEC SelectAllCustomers @Name = '" + s[0] + "', @DataType = '" + s[1] + "';";

    SqlCommand command2 = new SqlCommand(query, connection);
    command2.ExecuteReader();

我的 DATABASE Schema 由名为 InventoryDatabase 的基本数据库组成,在一个名为 LoginInfo 的表中存储用户信息,其余表将是我们在上面创建的表。问题是,我的存储过程抛出语法错误。

【问题讨论】:

你不能说ALTER TABLE @TableName - 请阅读动态SQL SQL注入。 Stored(不是Storage)。 变量不能用来代替对象的名字;无论如何,肯定不是没有动态SQL。但我强烈建议你也不要走这条路,因为很明显你没有注意到 SQL 注入的巨大危险。你在这里的真正目标是什么? 【参考方案1】:

选项 1:将 SQL 脚本准备为可以在 C# 代码中创建或更改表的字符串,然后使用 ExecuteNonQuery 方法执行准备好的字符串。

选项2:使用动态SQL概念,在存储过程中准备create/alter table脚本,然后执行

【讨论】:

【参考方案2】:

您必须使用动态 SQL。下面是一个帮助您入门的示例:

create or alter procedure CreateTable @TableName varchar(100)
as
begin
     declare @sql nvarchar(max) = 
     concat('create table ',quotename(@TableName),' AccountId int primary key identity(1,1)');
     exec (@sql);
end

请注意,名称是通过quotename 函数传递的,以防止 SQL 注入。

【讨论】:

以上是关于在 SQL Server Management Studio 中创建存储过程时出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SQL Server Management Studio 中注册 SQL Server 服务器?

SQL Server Management Studio (SSMS,SQL Server管理工具) 一直在加载程序包解决方案

如何使用 Windows 和 SQL 身份验证使用 SQL Server Management Studio 连接到 SQL Server

使用 SQL Server Management Studio 连接到 SQL Server

如何使用 SQL Server Management Studio (2008) 在 SQL Server Compact Edition 中创建列

在 SQL Server Management Studio 中更改 SQL Server 数据库中的列属性