sql - 从参数值中选择 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
解决方案
如果不使用动态 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 )
推荐阅读
- node.js - 在运行nestjs并达到任何端点时看不到console.log()或记录器消息
- sql - 将 SQL 数据库从 Azure 导出到本地时出错
- javascript - 如何使用逗号分割字符串?
- reactjs - 如何使用 Redux Tool Kit 的“createSlice”对 Redux 进行单元测试?
- kotlin - kotlin - 更新 kotlin 版本时的类型推断和类型不匹配
- java - 如何在没有秘密的情况下检查 JWT 令牌过期时间?
- javascript - Onfido SDK 一种文档类型直接捕获屏幕?
- perl - Perl 等效于 bash 命令
- java - 如何将普通的双精度数组转换为番石榴不可变数组
- c# - C# WPF Dispatcher Timer Tick 在单独的线程中