sql server-如何将C#程序中的(表)变量传递给sql脚本
本文关键字:sql 变量 脚本 server- 程序 | 更新日期: 2023-09-27 18:00:25
我想在C#中有一个函数,它的参数将是从中读取的SQL脚本中的表名。代码在C#中看起来像这样:
static void createTable(SqlConnection connection, String tableName, String fileName)
{
try
{
var fileContent = File.ReadAllText(fileName+".sql");
var sqlQueries = fileContent.Split(new[] { " GO " }, StringSplitOptions.RemoveEmptyEntries);
var cmd = new SqlCommand(fileName, connection);
SqlParameter param = cmd.Parameters.Add("@toBeReplaced", tableName);
connection.Open();
foreach (var query in sqlQueries)
{
cmd.CommandText = query;
cmd.ExecuteNonQuery();
}
connection.Close();
}
catch (SqlException e)
{
Console.WriteLine(e.ToString());
}
}
当这个函数运行时,我希望它执行fileName.sql中的脚本,在那里它插入到表"tableName"中。.sql脚本如下所示:
use myDatabase
GO
alter table TESTPersonsProject drop constraint FK_TESTPersonsProject_TESTproject
alter table TESTSideResearch drop constraint FK_TESTSideResearch_TESTproject
alter table TESTSamples drop constraint FK_TESTSamples_TESTproject
alter table @toBeReplaced drop constraint PK_TESTProject
alter table @toBeReplaced add tmp int;
GO
update @toBeReplaced set tmp=projectID where tmp is null
alter table @toBeReplaced drop column projectID
alter table @toBeReplaced add id_new int identity(1,1)
alter table @toBeReplaced add constraint PK_TESTProject primary key (id_new)
...
我知道我可以让函数看起来很难看,只将查询作为字符串。但是,我确实希望它保持干净,并且能够将此函数用于多个查询。
如何声明和使用此传递的变量,以便此查询可以影响多个指定的表?
p.s.我正在使用SQL SERVER 2008
在SQL中不能将变量用作表或列名。列名和表名必须是静态的。
执行所需操作的唯一方法是通过字符串串联生成查询。您可以在使用EXECUTE运行字符串查询的存储过程中进行串联,也可以在C#中进行串联并直接执行字符串。
无论哪种方式,都要确保验证您的输入,因为这两种技术都容易受到SQL注入的攻击。
请参阅此处:表名为变量
您不能在SQL Server中为表名使用参数,既然您已经在读取查询,为什么不自己替换呢?
foreach (var query in sqlQueries)
{
cmd.CommandText = query.Replace("@toBeReplaced", tableName);
cmd.ExecuteNonQuery();
}
您应该这样做,因为您对SQL字符串串联不感兴趣。
use myDatabase
GO
DECLARE @queryvarchar(MAX)
SET @query= '
alter table TESTPersonsProject drop constraint FK_TESTPersonsProject_TESTproject
alter table TESTSideResearch drop constraint FK_TESTSideResearch_TESTproject
alter table TESTSamples drop constraint FK_TESTSamples_TESTproject
alter table @toBeReplaced drop constraint PK_TESTProject
alter table @toBeReplaced add tmp int;
GO
update @toBeReplaced set tmp=projectID where tmp is null
alter table @toBeReplaced drop column projectID
alter table @toBeReplaced add id_new int identity(1,1)
alter table @toBeReplaced add constraint PK_TESTProject primary key (id_new)'
EXEC (@query)
但我相信你这样做比在C#中替换更难看