在sql server上使用2个数据库的join语句不会接受数据库名称作为变量

时间:2014-01-07 09:40:49

标签: c# sql sql-server database

我目前正在尝试使用sql join语句来恢复程序所需的结果。当我尝试将其中一个数据库名称更改为变量时,它显示异常“System.Data.SqlClient.SqlException(0X80131904):'。'附近的语法不正确。”两个数据库都在同一个SQL服务器上。如果我使用字符串中的一个数据库名称,它将连接并按预期执行语句。仅当我将数据库名称作为参数时才会出现这种情况:

   using (var command = new SqlCommand("select p.Tablefield, P.TableFeild, es.SynchronousIn, es.SynchronousOut, " +
                                                "es.dddd, es.MessageName, es.MessageDate from database.xxx.xxx es " +
                                                "join @Database.dbo.xxxx p on p.GUID = es.dddd where es.MessageName = @MessageType and " +
                                                "(es.MessageDate >= @date and es.MessageDate < @date)" +
                                                "and es.dddd = @ddddd " +
                                                "order by MessageDate DESC" , connection))

之后定义@Database参数:

command.Parameters.Add("@Database", SqlDbType.NVarChar);
command.Parameters["@Database"].Value = DatabaseName;

有什么想法吗?我知道这可能不是最好的方法,我对c#的SQL方面很新,并想知道这是否可行。我用XXXX或DDDD替换了某些字段,因为这是我希望为我公司写的工具。

3 个答案:

答案 0 :(得分:1)

您无法将数据库名称作为参数传递。您可以使用String.Format在sql命令字符串上添加它。

这样的事情:

String.Format("select p.Tablefield, P.TableFeild, es.SynchronousIn, es.SynchronousOut, " +
"es.dddd, es.MessageName, es.MessageDate from database.xxx.xxx es " +
"join {0}.dbo.xxxx p on p.GUID = es.dddd where es.MessageName = @MessageType and " +
"(es.MessageDate >= @date and es.MessageDate < @date)" + "and es.dddd = @ddddd " +
"order by MessageDate DESC", DatabaseName);

答案 1 :(得分:1)

检查以下内容:

String.Format("select p.Tablefield, P.TableFeild, es.SynchronousIn, es.SynchronousOut, " +
"es.dddd, es.MessageName, es.MessageDate from database.xxx.xxx es " +
"join {0}.dbo.xxxx p on p.GUID = es.dddd where es.MessageName = @MessageType and " +
"(es.MessageDate >= @date and es.MessageDate < @date)" + "and es.dddd = @ddddd " +
"order by MessageDate DESC", DatabaseName);

答案 2 :(得分:0)

您无法将表名作为参数传递。您只需使用string.Format将表名插入SQL字符串即可。像...这样的东西。

 using (var command = new SqlCommand("select p.Tablefield, P.TableFeild, es.SynchronousIn, es.SynchronousOut, " +
                                            "es.dddd, es.MessageName, es.MessageDate from database.xxx.xxx es " +
                                            string.Format("join @{0}.dbo.{1} p on p.GUID = es.dddd where es.MessageName = @MessageType and ",databaseName,tableName) +
                                            "(es.MessageDate >= @date and es.MessageDate < @date)" +
                                            "and es.dddd = @ddddd " +
                                            "order by MessageDate DESC" , connection))

如果以任何方式从用户界面操作,请务必检查此SQL注入值。