没有sp_executesql

时间:2019-02-19 21:41:00

标签: sql sql-server

这个问题的标题可能并不完全符合我的要求,但是我真的不确定如何在一个句子中对其进行总结。但其核心是我正在寻找一种处理输入的方法,该输入可以是特定值,选择语句或不带sp_executesql的空白字符串。我正在为允许自定义sql但以奇怪方式传递参数的系统编写报告。通常,您应该在应用程序中配置where子句的一部分,然后将其映射到令牌,即:#property#

运行报告时,供应商的系统将使用您的sql语句,如果用户为映射到该令牌的参数选择了一个值,则在运行它之前将其插入到sql中。来自我们控制自己的用户界面应用程序的报告背景,这使我发疯,因为代码散落在各处,并且在整个报告定义中都有乱七八糟的SQL乱七八糟,我每次调试某些内容时都必须替换这些行。我正在尝试清理所有令牌并将其分配到代码的顶部,在其中将它们转储到将在其余查询中使用的变量中。例如,应用程序中的报表配置在(#vendor#)中设置Condition50 = v.primaryKey。 然后,每当查询对供应商进行过滤时,它就会看起来像这样。

WHERE 1=1
#Condition50# --at runtime, #Condition50# is replaced with AND v.primaryKey in (#vendor#)

我的问题是系统生成的某些令牌根据用户选择其参数值的方式以不同的格式传递。例如,如果用户明确选择了一些属性,则该应用将我的#property#令牌替换为以下值:1、2、3(代表属性的主键,大多数过滤器似乎都以此方式工作)。这意味着我可以将该令牌包装在单引号中,并将其放入逗号分隔的列表中,然后使用CHARINDEX进行过滤。即批准者:

WHERE (1 = 1)
AND (
    @selectedApprovers = ',,' OR
    CHARINDEX(',' + cast(x.approverhmy as varchar) + ',', @selectedApprovers, 0) > 0
)

对于属性,用户还可以选择一组属性(属性列表)。用户执行此操作后,#property#令牌将替换为如下所示的select语句:select hProperty from listprop2 where hPropList in (1,2,3)。我没有访问sp_executesql的权限,所以我不能只是将过滤器转储到varchar中,检测何时提供了特定ID的列表,并使用其生成有效的sql来填充表变量。如果我设置了这样一个表(如下所示),而用户未选择列表,则SQL无效:

文件中的SQL

DECLARE @selectedProperties TABLE (hMy numeric)
IF '#hProp#' <> ''
BEGIN
    INSERT INTO @selectedProperties
    #hProp#
END

成为-具有特定属性

DECLARE @selectedProperties TABLE (hMy numeric)
IF '#hProp#' <> ''
BEGIN
    INSERT INTO @selectedProperties
    1,2,3
END

成为-选择了属性列表

DECLARE @selectedProperties TABLE (hMy numeric)
IF '#hProp#' <> ''
BEGIN
    INSERT INTO @selectedProperties
    select hProperty from listprop2 where hPropList in (1,2,3)
END

或者,如果未选择任何属性

DECLARE @selectedProperties TABLE (hMy numeric)
IF '#hProp#' <> ''
BEGIN
    INSERT INTO @selectedProperties
    --error, invalid sql
END

我越来越怀疑,对于这种过滤器类型,我将不得不将其吸纳起来并保持怪异的行为,并继续在SQL中使用#property#令牌乱扔where子句。我希望有人对我的怪诞技巧有个想法,可以用来处理这两种情况而不会引起SQL解析错误。我真的希望我可以在我们使用的应用程序中更改一些设计决策。

0 个答案:

没有答案