sql - 编写动态 SQL 函数

标签 sql sql-server sql-server-2008

我在尝试从 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/

相关文章:

mysql - sql查询查找复式

sql - 用列中最长数据的长度设置子串长度

sql-server-2008 - xp_fileexist 与 IF EXISTS

sql - 从电子表格更新现有数据库值

sql-server - sql server 2005中的递归函数?

sql-server - 如何使用 XQuery-sql 在 XML 中查找祖先

sql-server - 如何生成脚本以使用 SQL Server Management Studio [架构和数据] 重新创建表?

java - Java 的 SQL 解析器库

mysql - 根据有序列表中的更改修改数据库表

sql - PostgreSQL age() 函数 : different/unexpected results when landing in dfferent month