具有可为空的out参数的SQL Server 2016 CLR存储过程

时间:2017-03-01 01:02:54

标签: sql-server stored-procedures parameters nullable sqlclr

我在C#中使用以下方法定义创建了一个CLR存储过程:

public static void MyProcedure (SqlString path, SqlString fileName, out SqlBoolean? myValue)

但是当我尝试在SQL Server 2016中创建它时:

create procedure [dbo].[MyProcedure] 
     @path nvarchar(max), 
     @fileName nvarchar(max), 
     @myValue bit output
with execute as caller 
as external name [MyAssembly].[StoredProcedures].[MyProcedure]

我收到以下错误:

  

“MyProcedure”的CREATE PROCEDURE失败,因为参数“@myValue”的T-SQL和CLR类型不匹配。

是否有任何可能的方法来创建具有可为空参数的CLR存储过程?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

从C#代码中的参数类型中取出问号。 #include <random> #include <iostream> #include <algorithm> #include <list> #include <sstream> void NotFoundMessage(std::list<char>& randomSequence); void FoundMessage(long long iterationCount); // Seed with a real random value, if available std::random_device r; std::default_random_engine e1(r()); // A random character between 'A' and 'Z' std::uniform_int_distribution<int> uniform_dist('A', 'Z'); char nextRandomCharacter() { return static_cast<char>(uniform_dist(e1)); } int main() { std::string input; std::cin >> input; // <--- NEEDS CHECKS IF INPUT IS CORRECT!!!! std::list< char > randomSequence; // Fill randomSequence with initial data for ( const auto& c : input ) { randomSequence.push_back( nextRandomCharacter() ); } long long iterationCount = 1; while ( !std::equal( input.begin(), input.end(), randomSequence.begin() ) ) { NotFoundMessage( randomSequence ); // remove character from front and add random char at end. randomSequence.pop_front(); randomSequence.push_back( nextRandomCharacter() ); iterationCount++; } FoundMessage(iterationCount); } void NotFoundMessage(std::list<char>& randomSequence) { std::cout << "Not found in: "; for ( const auto& c : randomSequence ) std::cout << c << ' '; std::cout << '\n'; } void FoundMessage(long long iterationCount) { std::cout << "Found after " << iterationCount << " iterations." << std::endl; } 类型已经可以为空。

要将任何Sql*类型设置为T-SQL中的Sql*,请使用静态NULL字段(例如Null)。

要测试任何SqlBoolean.Null类型以查看它们是否为null,请检查布尔Sql*属性(例如IsNull)。

要了解有关使用SQLCLR的更多信息,请查看我在SQL Server Central上针对该主题撰写的系列文章:Stairway to SQLCLR