Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将查询作为参数发送到SQL函数_Sql_Sql Server - Fatal编程技术网

将查询作为参数发送到SQL函数

将查询作为参数发送到SQL函数,sql,sql-server,Sql,Sql Server,我想创建一个SQL表值函数,该函数将通过API接收一个作为n参数的查询。在我的函数中,我希望执行该查询。查询将是SELECT语句 这是我到目前为止所做的和要实现的,但这不是正确的方式 CREATE FUNCTION CUSTOM_EXPORT_RESULTS ( @query varchar(max), @guid uniqueidentifier, @tableName varchar(200)) RETURNS TABLE AS RETURN ( --

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

这是我到目前为止所做的和要实现的,但这不是正确的方式

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
请建议正确的方法

试试这个-

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

您也可以使用存储过程,下面是您可以尝试的代码

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 '+@tableName+' FROM')
    exec sp_executesql @strQuery
)
GO

我在你的问题中看到的是以下内容的封装:

  • 采用动态SQL表达式
  • 执行它以填充参数化表
为什么要有这样的封装

首先,这可能会对数据库性能产生负面影响。请阅读。我希望您的SP不会从应用程序的多个部分调用,因为这会给您带来麻烦,至少在性能方面是这样

另一件事是——您是如何构建SQL的,在哪里构建的?很明显,你在别的地方做了,它看起来是手工创建的。如果我们谈论的是当代应用程序,那么有很多OR/M解决方案可以解决这个问题,如果可能的话,应该避免在运行时手动构建TSQL。更不用说EXEC并没有保护您免受任何形式的SQL注入攻击。但是,如果所有这些都是某个数据库管理TSQL包的一部分,那么就不要考虑他的段落

最后,如果您想简单地从一些现有的表(或部分)加载一个新表作为TSQL的一些管理任务的一部分,请考虑发出一个选择…进入这将为您创建一个新的目标表结构(省略索引和约束)并复制数据。SELECT INTO将优于INSERT INTO SELECT,因为


我希望这将使您(和其他人)至少走上一条正确的道路。

SQL Server?还是另一个数据库系统?请添加合适的标签。对于SQL Server,您不能从函数内执行特殊SQL。为什么要使用函数进行导出?在我的API中,“将查询执行到表中”是什么意思?我将调用函数,该函数将返回已发送查询的结果。我的函数将返回@tableNameSorry中的数据,但这个答案是错误的。不能从函数中执行特殊SQL。