Nat*_*oop 42 sql sql-server parameters sql-server-2005 user-defined-functions
我想将一个表作为参数传递给一个缩放器UDF.
我还希望将参数限制为只有一列的表.(可选的)
这可能吗?
编辑
我不想传递表名,我想传递数据表(作为参考,我认为)
编辑
我希望我的Scaler UDF基本上采用值表并返回行的CSV列表.
IE
col1
"My First Value"
"My Second Value"
...
"My nth Value"
Run Code Online (Sandbox Code Playgroud)
会回来的
"My First Value, My Second Value,... My nth Value"
Run Code Online (Sandbox Code Playgroud)
我想对表做一些过滤,IE确保没有空值并确保没有重复.我期待的是:
SELECT dbo.MyFunction(SELECT DISTINCT myDate FROM myTable WHERE myDate IS NOT NULL)
Run Code Online (Sandbox Code Playgroud)
Luk*_*sik 71
你可以,但没有任何表.来自文档:
对于Transact-SQL函数,除时间戳数据类型外,允许使用所有数据类型,包括CLR用户定义类型和用户定义的表类型.
您可以使用用户定义的表类型.
用户定义的表类型示例:
CREATE TYPE TableType
AS TABLE (LocationName VARCHAR(50))
GO
DECLARE @myTable TableType
INSERT INTO @myTable(LocationName) VALUES('aaa')
SELECT * FROM @myTable
Run Code Online (Sandbox Code Playgroud)
所以你可以做的是定义你的表类型,例如TableType定义funcion,它接受这种类型的参数.一个示例函数:
CREATE FUNCTION Example( @TableName TableType READONLY)
RETURNS VARCHAR(50)
AS
BEGIN
DECLARE @name VARCHAR(50)
SELECT TOP 1 @name = LocationName FROM @TableName
RETURN @name
END
Run Code Online (Sandbox Code Playgroud)
参数必须是READONLY.示例用法:
DECLARE @myTable TableType
INSERT INTO @myTable(LocationName) VALUES('aaa')
SELECT * FROM @myTable
SELECT dbo.Example(@myTable)
Run Code Online (Sandbox Code Playgroud)
根据您的需要,您可以修改此代码.
编辑: 如果表中有数据,您可以创建一个变量:
DECLARE @myTable TableType
Run Code Online (Sandbox Code Playgroud)
并将表中的数据传递给变量
INSERT INTO @myTable(field_name)
SELECT field_name_2 FROm my_other_table
Run Code Online (Sandbox Code Playgroud)
gbn*_*gbn 16
不幸的是,在SQL Server 2005中没有简单的方法.Lukasz的答案对于SQL Server 2008来说是正确的,但该功能早就应该了
任何解决方案都涉及临时表,或者在UDF中传入xml/CSV和解析.示例:更改为xml,在udf中解析
DECLARE @psuedotable xml
SELECT
@psuedotable = ...
FROM
...
FOR XML ...
SELECT ... dbo.MyUDF (@psuedotable)
Run Code Online (Sandbox Code Playgroud)
但是你想在大局中做些什么呢?可能还有另一种方法可以做到这一点......
编辑:为什么不将查询作为字符串传递并使用带有输出参数的存储过程
注意:这是一个未经测试的代码,你需要考虑SQL注入等.但是,它也满足你的"一列"要求,应该帮助你
CREATE PROC dbo.ToCSV (
@MyQuery varchar(2000),
@CSVOut varchar(max)
)
AS
SET NOCOUNT ON
CREATE TABLE #foo (bar varchar(max))
INSERT #foo
EXEC (@MyQuery)
SELECT
@CSVOut = SUBSTRING(buzz, 2, 2000000000)
FROM
(
SELECT
bar -- maybe CAST(bar AS varchar(max))??
FROM
#foo
FOR XML PATH (',')
) fizz(buzz)
GO
Run Code Online (Sandbox Code Playgroud)
第1步:创建一个名为TableType的表类型,该表将接受具有一个varchar列的表
create type TableType
as table ([value] varchar(100) null)
Run Code Online (Sandbox Code Playgroud)
步骤2:创建一个函数,该函数将上面声明的TableType用作表值参数,并将字符串值作为分隔符
create function dbo.fn_get_string_with_delimeter (@table TableType readonly,@Separator varchar(5))
returns varchar(500)
As
begin
declare @return varchar(500)
set @return = stuff((select @Separator + value from @table for xml path('')),1,1,'')
return @return
end
Run Code Online (Sandbox Code Playgroud)
步骤3:将具有一个varchar列的表传递给用户定义的类型TableType,并在函数中使用“,”作为分隔符
select dbo.fn_get_string_with_delimeter(@tab, ',')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
141536 次 |
| 最近记录: |