我在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存储过程?如果是这样,怎么样?
答案 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。