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 server-如何将C#程序中的(表)变量传递给sql脚本

在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#中替换更难看