首页 > 解决方案 > 从参数值中选择 SQL 列

问题描述

我有一个表,其中包含 CR_Name、CV_Name、IC_Name 等列标题。我正在尝试编写一个查询,以便如果 @p 参数设置为“CR”,我的选择查询将提取 CR_Name 列以及我想要以 CR 开头的任何其他列。

我尝试了以下方法,但失败了。有可能吗?如果可以,怎么办?

declare @p char(2) = 'CR'

select
@p_name  --I want this to be the 'CR_name' column
from table
where @p_status = 0 --I want this to be the CR_status column

标签: sqltsql

解决方案


如果不使用动态 SQL(也就是从字符串串联生成 SQL,这本质上是危险的),就不能在 T-SQL 中参数化标识符。无论如何,只需选择所有列并更改应用程序代码中的读取逻辑。

我注意到在查询中选择列真的很便宜(除非它是一个大的二进制列,比如varbinary(8000)什么)。

您的问题还询问了条件WHERE从句。不幸的是(据我所知,截至 2019 年 3 月)SQL Server 的查询优化器仍然无法正确优化某些模式,例如 match-always-if-parameter-is-null 模式,但如果您的表不是高负载那么它可能没问题。

像这样:

DECLARE @param1 int         = NULL
DECLARE @param2 varchar(50) = 'john smith'
DECLARE @param3 float       = 123

SELECT
    CR_name,
    CV_name,
    IC_name
FROM
    ...
WHERE
    ( @param1 IS NULL OR CR_name = @param1 )
    AND
    ( @param2 IS NULL OR CV_name = @param2 )
    AND
    ( @param3 IS NULL OR IC_name = @param3 )

推荐阅读