在 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 中创建列