SQL CLR 访问临时 Table
SQL CLR Access Temporary Table
我是 SQL CLR 的新手,我将使用它来反转地理编码温度 table 结果
计划场景将是
- 为报表结果table创建临时table的存储过程
- 调用 SQL 将从临时 table 结果
填充数据的 CLR 函数table
- i will do reverse reverse geocoding (反向地理编码功能
实施和工作良好)并填写新的位置列
这个数据table
- 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(请注意:该站点需要免费注册阅读文章)。
我是 SQL CLR 的新手,我将使用它来反转地理编码温度 table 结果
计划场景将是
- 为报表结果table创建临时table的存储过程
- 调用 SQL 将从临时 table 结果 填充数据的 CLR 函数table
- i will do reverse reverse geocoding (反向地理编码功能 实施和工作良好)并填写新的位置列 这个数据table
- 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(请注意:该站点需要免费注册阅读文章)。