3 回答
TA贡献1848条经验 获得超6个赞
不幸的是,SQL Server 2005中没有简单的方法。尽管如此,Lukasz的答案对于SQL Server 2008是正确的,而且该功能早就该了。
任何解决方案都将涉及临时表,或者传入xml / CSV并在UDF中进行解析。示例:更改为xml,在udf中解析
DECLARE @psuedotable xml
SELECT
@psuedotable = ...
FROM
...
FOR XML ...
SELECT ... dbo.MyUDF (@psuedotable)
不过,您想在更大范围内做什么?可能还有另一种方式可以做到这一点...
编辑:为什么不以字符串形式传递查询,并使用带有输出参数的存储过程
注意:这是未经测试的代码,您需要考虑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
TA贡献1811条经验 获得超4个赞
您可以,但是没有任何表格。从文档:
对于Transact-SQL函数,允许所有数据类型,包括CLR用户定义类型和用户定义表类型,但时间戳数据类型除外。
您可以使用用户定义的表类型。
用户定义表类型的示例:
CREATE TYPE TableType
AS TABLE (LocationName VARCHAR(50))
GO
DECLARE @myTable TableType
INSERT INTO @myTable(LocationName) VALUES('aaa')
SELECT * FROM @myTable
因此,您可以做的是定义表类型,例如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
该参数必须为READONLY。用法示例:
DECLARE @myTable TableType
INSERT INTO @myTable(LocationName) VALUES('aaa')
SELECT * FROM @myTable
SELECT dbo.Example(@myTable)
根据您要实现的目标,可以修改此代码。
编辑: 如果您在表中有一个数据,您可以创建一个变量:
DECLARE @myTable TableType
并从表中获取数据到变量
INSERT INTO @myTable(field_name)
SELECT field_name_2 FROm my_other_table
TA贡献1788条经验 获得超4个赞
第1步:创建一个名为TableType的表类型,该表将接受具有一个varchar列的表
create type TableType
as table ([value] varchar(100) null)
步骤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
步骤3:将具有一个varchar列的表传递给用户定义的类型TableType,并在函数中使用“,”作为分隔符
select dbo.fn_get_string_with_delimeter(@tab, ',')
- 3 回答
- 0 关注
- 681 浏览
添加回答
举报