将字符串拆分为子字符串,从" ] " "As"结尾



我已经从Microsoft SQL Server 2008 R2中的存储过程中提取了一个字符串, 使用此查询:EXEC sp_helptext 'MyStoredProcedureName';我需要将此字符串拆分为数组或子字符串,从结尾括号" ]"开始,以单词"As"结尾。 我必须保存所有以"@"开头的字段(fieldsArray)和这些字段的类型 - 在空格之后 (typeArray),然后将它们输出到node中的文件中.js格式如下:

InvoiceNo: {
type: DataType.String(255),
},

下面是提取的字符串:

CREATE PROCEDURE [dbo].[MyStoredProcedureName]
@InvoiceNo int
,@TransDate datetime 
,@CustomerID bigint
,@CurrencyID bigint
,@SalesInvoiceTypeID bigint 
,@DiscountAmount nvarchar(50) 
,@DetailXml ntext 
,@TotalAll float 
,@TotalBefore float 
,@TaxAmount float
,@OtherExpenses float
,@OutVouchersNo nvarchar(1000)
,@Notes nvarchar(1000) 
,@TotalWiegts float
,@VoucherDefID bigint
,@SalesmanID bigint
,@IsSale bit
AS
BEGIN TRANSACTION

编辑:我使用了另一个查询而不是上面提到的查询。现在我有一个包含查询结果的对象,该查询是每个字段的名称,每个字段都在单独的行中。我现在需要做的是将此对象分隔为字符串数组,以便我可以单独处理每个名称。 对象"名称"包含我使用的查询结果:

Names = await sequelize.query(namesQuery); 

这是console.log(Names);的输出

[ [ { '': 'InvoiceNo' },
{ '': 'TransDate' },
{ '': 'CustomerID' },
{ '': 'CurrencyID' },
{ '': 'SalesInvoiceTypeID' },
{ '': 'DiscountAmount' },

我尝试Names.split但是出现错误"Names.split不是函数">

您可以改为查询Sys.Parameters表:

SELECT Substring(Parameters.Name,2,255) + ': { type: DataType.' + 
CASE types.Name
WHEN 'varchar' THEN 'String(' + CAST(Parameters.Max_Length As Varchar)      
WHEN 'int' THEN 'Int'
ELSE 'COMPLETE THE REST OF THIS yourself.....'
END + '),},'
FROM Sys.Parameters
INNER JOIN sys.procedures on parameters.object_id = procedures.object_id 
INNER JOIN sys.types on parameters.system_type_id = types.system_type_id AND parameters.user_type_id = types.user_type_id
Where procedures.name = 'MyStoredProcedureName'

如果您认为符号@仅用于标识字段名称的开头,则可以按如下方式使用正则表达式:

let result = {}
str.match(/@w+ [a-z]+/g)
.map(s => s.match(/@(w+) ([a-z]+)/))
.forEach(r => {
let fieldName = r[1]
let type = r[2]
result[fieldName] = { type }
})
console.log(JSON.stringify(result, undefined, 2))

这将输出

{
"InvoiceNo": {
"type": "int"
},
"TransDate": {
"type": "datetime"
},
...
}

我想仅使用正则表达式也可以实现相同的效果,但代码以这种方式更容易理解:

  • 第一个match捕获所有@FieldName type字符串
  • 第二个match捕获这些FieldName中的每一个type
  • 最后一个用名称FieldName和内容{ type: "type" }的成员填充对象result
  • 最后一个命令格式化所有内容并输出到控制台

最新更新