我正在尝试让我的查询使用where子句查找从将特定列转换为varbinary和varchar的查询返回的信息。我必须进行转换,因为原始数据为十六进制。
我的查询:
SELECT ScriptID, RowOrder, cast(cast(ScriptData as varbinary(max)) as varchar(max)) AS Converted_SD
FROM Script_Data
典型的回报将是这样的:
--------------------------------------------------------------------------------------------
| ScriptID | RowOrder | Converted_SD |
--------------------------------------------------------------------------------------------
| 5006 | 1 | CVisScript {331 1 76 "\"1007\"" "Call.PeripheralVariable10" 284 "" |
| 5007 | 1 | CVisScript {332 1 76 "\"2007\"" "Call.PeripheralVariable10" 285 "" |
| 5009 | 1 | CVisScript {333 1 76 "\"1037\"" "Call.PeripheralVariable10" 286 "" |
| 5014 | 1 | CVisScript {334 1 76 "\"1407\"" "Call.PeripheralVariable10" 287 "" |
| 5015 | 1 | CVisScript {335 1 76 "\"1068\"" "Call.PeripheralVariable10" 288 "" |
| 5016 | 1 | CVisScript {336 1 76 "\"6578\"" "Call.PeripheralVariable10" 289 "" |
--------------------------------------------------------------------------------------------
我希望能够返回ScriptID,RowOrder,但仅返回Call.PeripheralVariable10及其前面的四位数字-Converted_SD列中没有其他内容。我已经尝试了很多子查询,但是我似乎无法将它们组合在一起。所以我设想它看起来像这样:
--------------------------------------------------------
| ScriptID | RowOrder | Converted_SD |
--------------------------------------------------------
| 5006 | 1 | 1007 Call.PeripheralVariable10 |
| 5007 | 1 | 2007 Call.PeripheralVariable10 |
| 5009 | 1 | 1037 Call.PeripheralVariable10 |
| 5014 | 1 | 1407 Call.PeripheralVariable10 |
| 5015 | 1 | 1068 Call.PeripheralVariable10 |
| 5016 | 1 | 6578 Call.PeripheralVariable10 |
--------------------------------------------------------
谢谢
如果使用的是SQL Server 2016,则可以使用string_split函数。
您可以在这里查看其用法(https://www.mssqltips.com/sqlservertip/4884/sql-server-2016-stringsplit-function/)
如果您知道格式将始终为带双引号的调用,则可以在双引号中使用此功能,如果您有多个带有replace的格式,则可以使用相同的定界符。
with cte as (
select 5006 as ScriptID, 1 RowOrder, 'CVisScript {331 1 76 "\"1007\"" "Call.PeripheralVariable10" 284 ""' as Con_SD union all
select 5007 as ScriptID, 1 RowOrder, 'CVisScript {332 1 76 "\"2007\"" "Call.PeripheralVariable10" 285 ""' as Con_SD union all
select 5009 as ScriptID, 1 RowOrder, 'CVisScript {333 1 76 "\"1037\"" "Call.PeripheralVariable10" 286 ""' as Con_SD union all
select 5014 as ScriptID, 1 RowOrder, 'CVisScript {334 1 76 "\"1407\"" "Call.PeripheralVariable10" 287 ""' as Con_SD union all
select 5015 as ScriptID, 1 RowOrder, 'CVisScript {335 1 76 "\"1068\"" "Call.PeripheralVariable10" 288 ""' as Con_SD union all
select 5016 as ScriptID, 1 RowOrder, 'CVisScript {336 1 76 "\"6578\"" "Call.PeripheralVariable10" 289 ' as Con_SD )
select c.ScriptID, c.RowOrder, tbl.n from cte c
cross apply (select * from string_split (con_SD, '"')) tbl(n)
where tbl.n like '%call%';
输出: