【问题标题】:SQL CLR Access Temporary TableSQL CLR 访问临时表
【发布时间】:2016-03-29 07:18:31
【问题描述】:

我是 SQL CLR 的新手,我将使用 to 对临时表结果进行反向地理编码

计划的情景将是

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

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

【问题讨论】:

    标签: c# sql-server tsql sqlclr


    【解决方案1】:

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

    如果这将是一个表值函数 (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(请注意:该站点需要免费注册才能阅读文章)。

    【讨论】:

    • 感谢您的回复,但正如您所说的有点令人困惑,听起来很清楚您遇到了我的问题,我会试一试
    【解决方案2】:

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

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

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

    【讨论】:

    • 我需要将其作为批处理,同时处理多行,我认为您的代码将使其发生在每一行分开
    猜你喜欢
    • 2017-09-11
    • 2011-12-22
    • 2012-11-12
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    相关资源
    最近更新 更多