2013-07-19 55 views
4

我想创建一个SQL表值函数,它将通过我的API接收一个查询作为n参数。在我的函数中,我想执行该查询。该查询将是一个SELECT语句。将查询作为参数发送到SQL函数

这是我迄今为止所做的以及要实现的目标,但这不是正确的方法。

CREATE FUNCTION CUSTOM_EXPORT_RESULTS ( 
    @query varchar(max), 
    @guid uniqueidentifier, 
    @tableName varchar(200)) 
RETURNS TABLE 
AS 
RETURN 
(
    -- Execute query into a table 
    SELECT * 
    INTO @tableName 
    FROM (
     EXEC(@query) 
    ) 
) 
GO 

请建议正确的方法!

+1

SQL Server?或者不同的数据库系统?请添加合适的标签。对于SQL Server,您不能在函数内执行临时SQL。 –

+0

为什么使用导出功能?为此更好的使用存储过程。 – Devart

+0

你是什么意思“执行查询到表” – Ravi

回答

3

尝试这一个 -

CREATE PROCEDURE dbo.sp_CUSTOM_EXPORT_RESULTS 

     @query NVARCHAR(MAX) = 'SELECT * FROM dbo.test' 
    , @guid UNIQUEIDENTIFIER 
    , @tableName VARCHAR(200) = 'test2' 

AS BEGIN 

    SELECT @query = 
      REPLACE(@query, 
       'FROM', 
       'INTO [' + @tableName + '] FROM') 

    DECLARE @SQL NVARCHAR(MAX) 
    SELECT @SQL = ' 
    IF OBJECT_ID (N''' + @tableName + ''') IS NOT NULL 
      DROP TABLE [' + @tableName + '] 
    ' + @query 

    PRINT @SQL 
    EXEC sys.sp_executesql @SQL 

    RETURN 0 

END 
GO 

输出 -

IF OBJECT_ID (N'test2') IS NOT NULL 
    DROP TABLE [test2] 
SELECT * INTO [test2] FROM dbo.test 
+6

只是因为你可以,并不意味着你应该...... :) – LoztInSpace

-3

您可以使用存储过程为好,这里是你可以尝试的代码。

CREATE FUNCTION CUSTOM_EXPORT_RESULTS 
( 
    @query varchar(max), 
    @guid uniqueidentifier, 
    @tableName varchar(200) 
) 
RETURNS TABLE 
AS 
RETURN 
(
    declare @strQuery nvarchar(max) 
    -- Execute query into a table 
    SET @strQuery = REPLACE(@query,'FROM', 'INTO '[email protected]+' FROM') 
    exec sp_executesql @strQuery 
) 
GO 
+3

对不起,但是这个答案是错误的。你不能在一个函数内执行专门的SQL。 – Devart

3

我在你的问题中看到的是什么的封装:

  • 采取动态SQL表达式
  • 执行它填补了参数化表

为什么你想拥有这种封装?

首先,这可能会对数据库性能产生负面影响。请阅读this on EXEC() and sp_executesql()。我希望你的SP不会被你的应用程序的多个部分调用,因为这会让你陷入麻烦,至少在性能方面。

另一件事是 - 如何以及在哪里构建你的SQL?显然你在别的地方做它,它似乎是手动创建的。如果我们谈论的是当代应用程序,那么有很多OR/M解决方案,如果可能的话,应始终避免在运行时手动构建TSQL。更不用说EXEC没有防范任何形式的SQL注入攻击。但是,如果所有这些都是某些数据库管理TSQL包的一部分,请忘记他的段落。最后,如果你想简单地从一些现有的表(或其中的一部分)加载一个新表作为TSQL中一些管理任务的一部分,考虑发出一个SELECT ... INTO ...这将会为您创建新的目标表结构(省略索引和约束)并复制数据。 SELECT INTO将优于INSERT INTO SELECT,因为SELECT INTO gets minimally logged

我希望这会让你(和其他人)至少有点在正确的轨道上。

相关问题