C# SQL 库正在将我的查询修改为完全限定的表

C# SQL Library is modifying my queries to fully qualified tables

它正在改变我的查询,似乎完全符合我的 table 的要求,而无需我明确告诉它。有没有办法阻止它这样做?

这是我看到的相关信息。让我知道是否还有其他帮助。

我们有一个名为 serverName 的 SQL 服务器。它已经投入生产多年。它已从 Windows 2008 服务器迁移到 Windows 2012 服务器。新服务器的名称是 sql_1234_4321(不是真实名称,但很糟糕)

我们有第 n 次访问旧 serverName SQL 服务器的应用程序,因此我们将旧服务器脱机并为 serverName 创建了一个指向新服务器的 DNS 条目sql_1234_4321 希望我们不必为访问旧服务器的所有应用程序访问连接字符串。

除某些 C# ASP.NET MVC 应用程序外,这在大多数情况下都有效。

他们正在使用 System.Data.SqlClient.SqlCommand.

连接字符串:

Data Source=serverName;Initial Catalog=USData; Persist Security Info=True; User ID=appUn;Password=appPw

SQL查询:

select FirstName from Customers

代码:

using (SqlCommand cmd = new SqlCommand(query, sqlConnection))
{
    if (parameters != null)
    {
        cmd.Parameters.AddRange(parameters.ToArray());
    }

    var reader = cmd.ExecuteReader();
    var results = new List<TType>();

    while (reader.Read())
    {
        results.Add(convert(reader));
    }

    return results;
}

我得到一个错误:

Could not find server 'serverName' in sys.servers.Verify that the correct server name was specified. If necessary, execute the stored procedure sp_addlinkedserver to add the server to sys.servers.

为什么会出现这个错误?唯一一次引用 serverName 是在连接字符串中。一旦在服务器上,我的查询就应该只使用默认命名空间。但似乎我的查询在过程中的某个时刻完全合格,如下所示:

select FirstName from serverName.USData.dbo.Customers

我在新的 sql_1234_4321 服务器上添加了一个链接服务器 serverName,它只指向自身,这似乎解决了问题。然而,这感觉绝对肮脏,让我想知道它是否真的在那个时候进行跨服务器查询,或者它是否足够聪明可以说 "HEY! we are hitting ourself so don't worry about going out to the network and making this more expensive than it should be" 但我对此表示怀疑。

我考虑过使用同义词,但问题是我们有 tables 其中包含服务器名称。并且可能有查询使用其中的服务器名称访问服务器,因此以下内容将不起作用:

CREATE SYNONYM serverName FOR sql_1234_4321;

那么我必须为服务器上的每个数据库创建一个特定的同义词是有道理的:

CREATE SYNONYM serverName.database1 FOR sql_1234_4321.database1;
CREATE SYNONYM serverName.database2 FOR sql_1234_4321.database2;
CREATE SYNONYM serverName.database3 FOR sql_1234_4321.database3;
CREATE SYNONYM serverName.database4 FOR sql_1234_4321.database4;
CREATE SYNONYM serverName.database5 FOR sql_1234_4321.database5;
CREATE SYNONYM serverName.database6 FOR sql_1234_4321.database6;
CREATE SYNONYM serverName.database7 FOR sql_1234_4321.database7;
CREATE SYNONYM serverName.database8 FOR sql_1234_4321.database8;
CREATE SYNONYM serverName.database9 FOR sql_1234_4321.database9;
CREATE SYNONYM serverName.database10 FOR sql_1234_4321.database10;

如您所见,这将是一场噩梦,而且感觉超级脏。

我的问题是...table 名称在什么时候根据连接字符串完全限定?有什么办法可以防止这种情况发生吗?

David Browne 带领我找到了问题所在。我的查询实际上引用了一个视图,并且该视图引用了旧服务器。我的巨大疏忽没有注意到这一点。谢谢大卫