我是关于SQL CLR的新手,我将用来反转地理编码临时表结果
计划的场景将是
那么如何从SQL CLR访问Temp表?
答案 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
此时,该功能根本不需要访问该表,因为所有数据都将传递给/通过它。