我在尝试从 SQL 函数返回表时遇到一些问题,其中创建表的 SQL 是动态编写的。
到目前为止我已经:
CREATE FUNCTION dbo.SEL_PCD
(
@COBDate AS DATETIME,
@FileName AS VARCHAR(50),
@PC AS VARCHAR(50),
@MyList AS VARCHAR(max),
DECLARE @SQL VARCHAR(max)
SET @SQL = 'SELECT * FROM
(SELECT tab1.TID FROM
(SELECT TID FROM dbo.SEL_RT('+@COBDate+','+@FileName+') WHERE BID IN ('+ @MyList +')) tab1
JOIN
(SELECT TID FROM CT WHERE (Col_Name LIKE %' + @PC + '% OR Bk LIKE %' + @PC + '%) AND FileName = ' + @FileName + ' AND COBDate = @COBDate) tab2
ON tab1.TID = tab2.TID) tab3
JOIN
(SELECT TID, Value FROM CR WHERE BID IN (' + @MyList + ') AND COBDate = ' + @COBDate + ' AND FileName = ' + @FileName + 'AND ScenID = 266) tab7
ON tab3.TID = tab7.TID'
)
RETURNS TABLE AS
RETURN
(
EXEC sp_executesql @SQL
)
GO
我在声明 SQL 变量时遇到错误。我可以通过执行命令返回表格吗?
最佳答案
尝试一下这个:
CREATE PROCEDURE dbo.SEL_PCD
(
@COBDate DATETIME,
@FileName VARCHAR(50),
@PC VARCHAR(50),
@MyList VARCHAR(max)
) AS
DECLARE @SQL VARCHAR(max)
SELECT @SQL = 'SELECT * FROM
(SELECT tab1.TID FROM
(SELECT TID FROM dbo.SEL_RT('+@COBDate+','+@FileName+') WHERE BID IN ('+ @MyList +')) tab1
JOIN
(SELECT TID FROM CT WHERE (Col_Name LIKE %' + @PC + '% OR Bk LIKE %' + @PC + '%) AND FileName = ' + @FileName + ' AND COBDate = @COBDate) tab2
ON tab1.TID = tab2.TID) tab3
JOIN
(SELECT TID, Value FROM CR WHERE BID IN (' + @MyList + ') AND COBDate = ' + @COBDate + ' AND FileName = ' + @FileName + 'AND ScenID = 266) tab7
ON tab3.TID = tab7.TID'
EXEC(@SQL)
函数
- 可以与 Select 语句一起使用
- 不返回输出参数,但返回表变量
- 您可以加入 UDF
- 不能用于更改服务器配置
- 不能与 XML FOR 子句一起使用
- 函数内不能进行事务
存储过程
- 必须使用 EXEC 或 EXECUTE
- 返回输出参数
- 可以创建表,但不会返回表变量
- 您无法加入 SP
- 可用于更改服务器配置
- 可以与 XML FOR 子句一起使用
- 可以在SP内进行交易
关于sql - 编写动态 SQL 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11243457/