这有点令人困惑,但听起来您想从本地临时表(即#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(请注意:该站点需要免费注册才能阅读文章)。