在sql的where子句中使用变量作为列名

时间:2015-02-04 13:04:15

标签: sql sql-server ssms

我想在我的SQL查询中使用变量作为列名。

问题:

我不能使用动态SQL作为我在用户定义的内联表函数中的SQL查询。

所以,   1.无法使用动态SQL   2.无法用存储过程替换此函数,因为这只能从用户定义的函数中调用

还有其他可能的选择吗?

我的代码如下:

create function MatchStringPercent(@parameterFromUser nvarchar(20), @parameterInTable nvarchar(20))
RETURNS table As Return 
SELECT Top(1)
cast(LEN(@parameterInTable) as float)/(Abs(LEN(@parameterFromUser) - LEN(@parameterInTable)) + LEN(@parameterInTable))* 100 As Match
FROM Demo
WHERE @parameterInTable = LEFT( @parameterFromUser , LEN(@parameterInTable) ) 
ORDER BY LEN(@parameterInTable) DESC 
Go

注意:这是转贴。我确实问了这个问题here并被告知这是不可能的。也许。但只是想知道是否有任何该死的替代品。

1 个答案:

答案 0 :(得分:1)

你唯一真正的选择是一个巨大的case陈述:

where (case when @parameterInTable = 'col1' then col1
            when @parameterInTable = 'col2' then col2
            . . .
       end) = . . .

不幸的是,更干净的解决方案是使用动态SQL,而您无法通过函数执行此操作。

我曾经看到一些奇怪的机制,函数可以调用xp_cmdshell,然后使用cmd_shell执行动态SQL,然后在命令shell中执行工作。函数 允许运行扩展存储过程。我非常高兴,不鼓励你走向那个方向。它太复杂了,它可能会在某些时候停止工作,它需要摆弄可能会使您的系统更容易受到攻击的权限。

编辑:

你可能想要一个稍微复杂的表达式(我没有意识到参数在右侧和左侧):

where ( (@parameterInTable = 'col1' and col1 = LEFT(@parameterFromUser , LEN(col1)) ) or
        (@parameterInTable = 'col2' and col2 = LEFT(@parameterFromUser , LEN(col2)) ) or
        . . .
      )

或使用case

where @parameterFromUser like
       (case when @parameterInTable = 'col1' then col1
             when @parameterInTable = 'col2' then col2
            . . .
        end) + '%';