SQL CLR 访问临时 Table

SQL CLR Access Temporary Table

我是 SQL CLR 的新手,我将使用它来反转地理编码温度 table 结果

计划场景将是

  1. 为报表结果table创建临时table的存储过程
  2. 调用 SQL 将从临时 table 结果
  3. 填充数据的 CLR 函数table
  4. i will do reverse reverse geocoding (反向地理编码功能 实施和工作良好)并填写新的位置列 这个数据table
  5. Return Datatable 作为我的存储过程的新临时 table 所以我会 加入结果

那么如何从 SQL CLR 访问 Temp table?

如果是我,我会把它写成一个 table 值函数,接受(例如纬度和经度)和 returns 地址(反之亦然,如果我'我误会了)。然后,您可以像这样在 SQL 中调用它:

insert into #t (Address)
select clr.Address
from dbo.yourTable
cross apply dbo.yourCLRFunction(latitude, longitude) as clr

此时,该函数根本不需要访问 table,因为所有数据都将传递 to/through 它。

这有点令人困惑,但听起来您想从本地临时 table(即 #TableName)读取数据以传递一组值。在这种情况下,如果对连接字符串使用 Context Connection = true,则可以从 SQLCLR 对象中的本地临时 table 中 SELECT

如果这将是一个 Table 值函数 (TVF),那么它应该将 DataTable 中的行作为结果集传回。当然,您不需要在任一方向使用数据Table。您可以处理每个输入行并在读取下一个输入行之前将其传回:

ResultsStruct _ResultSet = new ResultsStruct();

using (SqlConnection _Connection = new SqlConnection("Context Connection = true"))
{
  using (SqlCommand _Command = _Connection.CreateCommand())
  {
    _Command.CommandText = "SELECT Column1, Column2 FROM #ValuesToPassIn;";
    _Connection.Open();

    using (SqlDataReader _Reader = new _Command.ExecuteReader())
    {
      while(_Reader.Read())
      {
        var1 = _Reader.GetInt32(0);
        var2 = _Reader.GetInt32(1);

        ProcessStuff(var1, var2);

        _ResultSet.SetString(0, something1);
        _ResultSet.SetSomething(1, something2);

        yield return _ResultSet;
      }
    }
  }
}

T-SQL 存储过程的一般结构为:

CREATE TABLE #ValuesToPassIn
(
  Column1 DATATYPE,
  Column2 DATATYPE,
  ...
);

INSERT INTO #ValuesToPassIn (Column1, Column2, ...)
VALUES (val1a, val2a, ...), (val1b, val2b, ...);

CREATE TABLE #ValuesComingBack
(
  ColumnA DATATYPE,
  ColumnB DATATYPE,
  ...
);

INSERT INTO #ValuesComingBack (ColumnA, ColumnB, ...)
  SELECT ResultField1, ResultField2, ...
  FROM   dbo.SqlClrTableValuedFunction();

或者,为了传入一组值,您可以将它们作为 XML:

发送
DECLARE @ValuesToPassIn XML;

SET @ValuesToPassIn = N'<vals>...</vals>';

CREATE TABLE #ValuesComingBack
(
  ColumnA DATATYPE,
  ColumnB DATATYPE,
  ...
);

INSERT INTO #ValuesComingBack (ColumnA, ColumnB, ...)
  SELECT ResultField1, ResultField2, ...
  FROM   dbo.SqlClrTableValuedFunction(@ValuesToPassIn);

有关使用 SQLCLR 的更多信息/详细信息,请参阅我在 SQL Server Central 上撰写的系列文章:Stairway to SQLCLR(请注意:该站点需要免费注册阅读文章)。