将 SQL 语句作为参数发送到存储过程

Send a SQL-statement as a parameter to a stored procedure

我想知道是否有任何聪明的解决方案可以将整个 SQL 语句作为参数发送到已经包含日期参数的存储过程。

见下文。

CREATE procedure sp_GetDataByDate
 @startdate datetime,
 @enddate datetime,
 @sqlStatement varchar(max)
as  
begin
   -- Here I want my SELECT-anything-somehow-statement
   @sqlStatement
   WHERE dbo.DummyDataTable.CreatedDT BETWEEN @startdate AND @enddate
end

首先采用 SQL 语句并使用该数据创建临时 table 以便稍后使用日期参数过滤出您想要的内容的解决方案可能有效,但它可能很重,因为它在这个数据库中有很多数据。

谢谢

您可以在 sql 服务器中使用具有此功能的 DQE(动态查询执行)您可以创建具有字符串功能的 TSQL 并执行它。

但此解决方案存在一些安全和性能问题。

在这种情况下,黑客可以使用 SQL 注入攻击来攻击您的站点,并且可能会在 sql 服务器上出现一些性能问题,例如计划捕获和参数嗅探。

最佳解决方案是创建不同的 SP 来加载信息。

 CREATE PROCEDURE sp_GetDataByDate
     @startdate datetime,
     @enddate datetime,
     @sqlStatement varchar(max)
    AS  
    BEGIN
       -- Here I want my SELECT-anything-somehow-statement
     SET @sqlStatement +=' WHERE dbo.DummyDataTable.CreatedDT BETWEEN '+CHAR(39)+ CONVERT(NVARCHAR , @startdate , 120 )+CHAR(39)+  ' AND ' +CHAR(39)+ CONVERT(NVARCHAR , @enddate , 120 )+CHAR(39)

     PRINT @sqlStatement 

     EXEC(@sqlStatement )
    END

DQE Microsoft Doc