【问题标题】:Execute a query string as part of a hard-coded statement作为硬编码语句的一部分执行查询字符串
【发布时间】:2022-02-12 05:31:20
【问题描述】:

我有一个运行选择语句的很长的存储过程。我想在最后添加的语句将在查询字符串中工作。是否可以在 SQL Server 中将查询字符串作为硬编码语句的一部分执行?

SELECT * 
FROM INV_DATA 
WHERE 1 = 1 
  AND MY_ID = 

SET @SQL = @SQL + ' SELECT id FROM people WHERE id = 
    CASE WHEN NOT EXISTS (SELECT ... WHERE storeID = (CASE WHEN ...@ACT_METHOD = ...)) AND ...'

【问题讨论】:

  • 看起来您并不真的需要动态 SQL。 @ACT_METHOD来自哪里?

标签: sql sql-server


【解决方案1】:

SQL Server 有一个内置的存储过程,可以对字符串变量sp_executesql 运行查询。

这是一个例子:

DECLARE @IntVariable INT;  
DECLARE @SQLString NVARCHAR(500);  
DECLARE @ParmDefinition NVARCHAR(500);  
  
/* Build the SQL string one time.*/  
SET @SQLString =  
     N'SELECT BusinessEntityID, NationalIDNumber, JobTitle, LoginID  
       FROM AdventureWorks2012.HumanResources.Employee   
       WHERE BusinessEntityID = @BusinessEntityID';  
SET @ParmDefinition = N'@BusinessEntityID tinyint';  
/* Execute the string with the first parameter value. */  
SET @IntVariable = 197;  
EXECUTE sp_executesql @SQLString, @ParmDefinition,  
                      @BusinessEntityID = @IntVariable;  
/* Execute the same string with the second parameter value. */  
SET @IntVariable = 109;  
EXECUTE sp_executesql @SQLString, @ParmDefinition,  
                      @BusinessEntityID = @IntVariable;  

SQL Server sp_executesql documentation

【讨论】:

  • 如果当前查询字符串超过 8000 个字符,Sql Server 会对此做一些调整吗?
  • 我认为问题出在您的字符串中,stackoverflow.com/questions/4833549/… 尝试将您的字符串拆分为其他字符串并在传递给sp 时连接起来。您可以创建一些视图和存储过程以减少您的“主要”代码。
【解决方案2】:

这不可能按照您尝试的方式进行。

实现相同结果的另一种方法是:

  1. 我假设,您要添加到现有过程的最后一条语句必须有一些动态条件,但它总是会返回一个 ID 列表。

  2. 所以写一个动态 SQL 来选择所有的 Id 并将结果放入一个临时表中。

Declare @sql varchar(2000) @sql = ''Select Id from ....'。 -- 把你想要添加到程序的查询放在这里。

Create table #temp ( Id int)

Insert into #temp Exec(@sql)
  1. 现在将此 #temp 表用作 proc 中现有选择查询的连接。
Select *
From INV_DATA a
Join #temp b On a MY_ID = b.id
Where 1=1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2018-09-18
    • 2020-11-25
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多