我想在我的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并被告知这是不可能的。也许。但只是想知道是否有任何该死的替代品。
答案 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) + '%';