将字符串拆分为从&#34开始的子字符串; ]"结束于" As"

时间:2017-02-14 12:49:34

标签: javascript sql-server node.js reactjs

我从Microsoft SQL Server 2008 R2中的存储过程中提取了一个字符串, 使用此查询: EXEC sp_helptext 'MyStoredProcedureName';我需要将此字符串拆分为数组或子字符串,从结束括号开始#34; ]"并以" As"结尾。 我必须保存以" @"开头的所有字段。 in(fieldsArray)和这些字段的类型 - 在space-in(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不是函数"

2 个答案:

答案 0 :(得分:1)

您可以改为查询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'

答案 1 :(得分:0)

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

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字符串
  • 每个matchFieldName
  • 的第二次type次捕获
  • 最后一个用名称result和内容FieldName
  • 的成员填充对象{ type: "type" }
  • 最后一个命令将所有内容和输出格式化为控制台