【发布时间】:2019-04-23 08:58:46
【问题描述】:
不确定这个问题是否有意义,但我是 CLR/UDT 的新手,刚刚在此处完成了此示例: https://docs.microsoft.com/en-us/sql/relational-databases/clr-integration/database-objects/getting-started-with-clr-integration?view=sql-server-2017
我现在想要实现的目标非常相似。我试过添加一个字符串参数没有失败,但是当添加一个 C# 对象时问题就开始了。
这是我的 C# Main:
[Microsoft.SqlServer.Server.SqlProcedure]
public static void HelloName(Person person, [param: SqlFacet(MaxSize=-1)]out string result)
{
SqlContext.Pipe.Send("Hello world!" + Environment.NewLine);
result = "Hello, " + person.firstName + " " + person.lastName;
}
这是 C# Person 类:
public class Person
{
public string firstName;
public string lastName;
public Person(string firstName, string lastName)
{
this.firstName = firstName;
this.lastName = lastName;
}
}
我能够成功创建程序集,但这是我卡住的过程。我想做类似的事情:
CREATE PROCEDURE helloname
(
@person (@firstname nchar(300), @lastname nchar(300))
@result nchar(300) OUTPUT
)
AS EXTERNAL NAME helloworld.HelloWorldProc.HelloName
但经过一些研究,显然处理对象的最佳方法是通过 UDT。我已经按照另一个示例在 T-SQL 中创建了一个 Person 表和一个 PersonType,如下所示:
CREATE TABLE Person
(
FirstName nvarchar(50),
LastName nvarchar(50)
)
Go
CREATE TYPE PersonType AS TABLE
(
FirstName nvarchar(50),
LastName nvarchar(50)
)
Go
错误发生在这里:
CREATE PROCEDURE helloname
(
@personType PersonType,
@result nchar(300) OUTPUT
)
AS EXTERNAL NAME helloworld.HelloWorldProc.HelloName
在尝试执行时,它显示“为“helloname”创建过程失败,因为参数“@personType”的 T-SQL 和 CLR 类型不匹配。”
如何让“PersonType”等于 C# 类“Person”才能正常工作?让我知道我是否以完全错误的方式解决此问题/是否有更简单的解决方案。理想情况下,我将在 Person 中传递一个具有多种变量类型的列表。提前致谢。
【问题讨论】:
标签: c# sql sql-server clr sqlclr