SQL CLR访问临时表

时间:2016-03-28 21:25:01

标签: c# sql-server tsql sqlclr

我是关于SQL CLR的新手,我将用来反转地理编码临时表结果

计划的场景将是

  1. 为报告结果创建临时表的存储过程
  2. 调用将从临时表结果中填充数据表的SQL CLR函数
  3. 我将做反向反向地理编码(反向地理编码功能 实施并运作良好)并填写新列的位置 这个数据表
  4. 将Datatable作为新的临时表返回到我的存储过程,所以我会 加入结果
  5. 那么如何从SQL CLR访问Temp表?

2 个答案:

答案 0 :(得分:2)

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

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

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(请注意:该站点需要免费注册才能阅读文章)。

答案 1 :(得分:0)

如果是我,我会把它写成一个表值函数(例如纬度和经度)并返回地址(反之亦然,如果我误解了)。然后,您可以像在SQL中一样调用它:

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

此时,该功能根本不需要访问该表,因为所有数据都将传递给/通过它。