bestlong / node-red-contrib-mssql-plus Goto Github PK
View Code? Open in Web Editor NEWA Node-RED node to read and write to Microsoft MS SQL Databases
License: MIT License
A Node-RED node to read and write to Microsoft MS SQL Databases
License: MIT License
Please increase the version for opportunity updates from npmjs.com and nodered.org
Thanks
Using:
Raspberry Pi 3 B+
Latest Raspbian Image
Node-Red v0.19.2
node-red-contrib-mssql-plus v0.0.12
mssql v3.3.0
I have total of four mssql-plus nodes in a flow. None of them are activated simultaneously.
Only one of the nodes is throwing this error. The other three function normally.
Restarting Node-Red didn't solve the issue.
Another note, I have an identical Node-Red instance running on a different Raspberry Pi that works normally.
There is Memory leak problem in both of your newest version 0.7.3 and prior version 0.3.3.
The testing flow was that you mentioned in the previous issue,
but I changed the input more quick, For example, 7200pcs / 5 seconds, and change the delay node to 10msg/s
(My work space need the input more large and more fast)
In this case, after running node-red around 1.5hours, the memory usage in node-red from 4% to 40%, and then node-red crashed.
Crashed again no matter how much times node-red restart.
However, I changed lots of your version 0.3.3 code, and actually there is no memory leak again, the problem is solving.
I am pleasure to help you to improve your code or maybe you can merge my code, but first I have couples of questions for you:
First of all, why did you use the module mustache and others for the MS-SQL configuration input? After I saw the page of module mustache page, I found that was major use for HTML template, am I correct? Therefore, I tried to delete it all in the red frame of picture (as shown below), I found the output that was no difference to your origin code. Here is your version 0.3.3 code:
Could you simply explain me what you were doing here?
Second, I noticed that you create new promise object for every node-mssql input, I am not sure whether the node-red use the cahch for every node. If yes, I guess that was very big problem. Why did you create a new promise object to include node-mssql promise object?
After I deleted these two point, and modified the code, the memory leak was never happen again even thought I set the input 9700 msg / 2 seconds, and total input 70 million messages.
Please help me, thanks.
Hi, I wonder how could I reconnect to the sql server after losting connection eg. network issues.
Hi
I am running NodeRed 1.0.3 together with node-red-contrib-mssql-plus 0.4.0.
When executing queries on the server, I get the error message: 'Tarn: opt max. must be an Integer > 0' right below the node.
Tried to google it but did not find anything useful.
DB is SQL Server Standard 2017.
Thanks for your help!
klib
I want to know if a new connection is created for each node or if a single connection is shared between many nodes.
Is there a way to get the msg_id returned when an error happened?
I would like to valitade the msg_id specially when using RAISERROR on SP for error handling on node-red
Thanks!
I am using the mssql-plus node to put about 500,000 records into a sql table, 1000 records at a time. When I do this, the program will eventually crash my controller after about 3 times of running the program. It seems like the query strings are being held in the memory after the flow is completed. Is this a known issue or am I using the node incorrectly?
If found a bug in mssql.js at the following line:
node-red-contrib-mssql-plus/src/mssql.js
Line 595 in 4c9d4c1
It should be node.paramsOptType
in stead of node.queryOptType
:
} else if(!node.paramsOptType || node.paramsOptType == "editor") {
The bug causes parameter values passed in msg to not work.
Hi Steve,
As you may have guessed from some from my posts on forum we are extensively into DB work.
For SQL Server we use your node (MSSQL Plus) and it fits our purpose perfectly (Thank You for this node.)
Recently as part of some work - we are now checking how to deploy flows across environments where the DB names etc. may differ.
Challenge - sending Password as ENV variable may run into security risk. We need to set it in settings.js which is in readable format.
Is it possible to add some functionality to password field where we can call some JSONATA function aka - base64decode.
Or maybe some extensible in addition to JSONATA - so that even if we set it in settings.js in encoded form - then using some "callable" mechanism set in password field - the password gets decoded and used by the node.
Hi,
I'm trying to parse a large CSV file (approx 10k records) and store it in SQL Server. As the SQL Server is remote or sometimes docker initialized, don't want to use bulk-insert.
Node-red is running in docker. data file is shared with it via volume mount.
Node-red can see the file (as I'm printing the entire payload as http response while debugging).
CSV is able to parse the whole file and share it per record basis.
My function before the MS-SQL invokes has below code:
exchCode = msg.payload["ExchangeCode"].trim()
exchange = msg.payload["Exchange"].trim()
indusry = msg.payload["Industry"].trim()
comp = msg.payload["CompanyName"].trim()
pld = "INSERT INTO [OCP_LOCAL].[ext].[Profile]"
pld = pld + "(CompanyName,ExchangeCode,Industry,Exchange,_seen) "
pld = pld + "VALUES ('" + comp + "','" + exchCode + "' ,'" + indusry + "','" + exchange + "',0)"
msg.payload = pld
return msg;
It is able to insert roughly 4 or 5 records in the database and for rest provides ECONNCLOSED. I believe the time taken to write one record is probably long hence provided below properties:
ConnectionTimeout: 60000
requesttimeout: 0
canceltimeout: 0
Also added delay of 1 second upto 5 seconds after CSV parser but still no luck. And last idea tried was Max Pool Size to 100 though still no difference on the number of records being inserted in DB.
[{"id":"1bf07b4d6f4c42cf","type":"tab","label":"csvreader","disabled":false,"info":""},{"id":"40fe383c56a1a128","type":"http in","z":"1bf07b4d6f4c42cf","name":"http-in","url":"/invokecsv","method":"get","upload":false,"swaggerDoc":"","x":170,"y":160,"wires":[["b0b04a9607b7444b"]]},{"id":"b0b04a9607b7444b","type":"file in","z":"1bf07b4d6f4c42cf","name":"ProfileMaster","filename":"/data/Profile_202108121438.csv","format":"utf8","chunk":false,"sendError":false,"encoding":"utf8","allProps":false,"x":350,"y":160,"wires":[["8cf03da220982022","712817f5220aab38"]]},{"id":"830d889c02bf783e","type":"debug","z":"1bf07b4d6f4c42cf","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1310,"y":180,"wires":[]},{"id":"8cf03da220982022","type":"http response","z":"1bf07b4d6f4c42cf","name":"","statusCode":"200","headers":{},"x":540,"y":240,"wires":[]},{"id":"9752a07b71f0349e","type":"switch","z":"1bf07b4d6f4c42cf","name":"","property":"payload[\"ExchangeCode\"]","propertyType":"msg","rules":[{"t":"nnull"}],"checkall":"true","repair":false,"outputs":1,"x":890,"y":60,"wires":[["129d3222e252ea8f"]]},{"id":"aa88f3f752cb3e99","type":"MSSQL","z":"1bf07b4d6f4c42cf","mssqlCN":"df8c0b88.91b0a8","name":"MSSQL","outField":"payload","returnType":"0","throwErrors":"0","query":"","modeOpt":"","modeOptType":"query","queryOpt":"payload","queryOptType":"msg","paramsOpt":"","paramsOptType":"none","rows":"","rowsType":"msg","params":[],"x":1140,"y":120,"wires":[["830d889c02bf783e","b1a99a1f10fd2aec"]]},{"id":"129d3222e252ea8f","type":"function","z":"1bf07b4d6f4c42cf","name":"update-sql-profile","func":"exchCode = msg.payload[\"ExchangeCode\"]\nexchange = msg.payload[\"Exchange\"]\nindusry = msg.payload[\"Industry\"]\ncomp = msg.payload[\"CompanyName\"]\n\npld = \"INSERT INTO [OCP_LOCAL].[ext].[Profile]\"\npld = pld + \"(CompanyName,ExchangeCode,Industry,Exchange) \"\npld = pld + \"VALUES ('\" + comp + \"','\" + exchCode + \"' ,'\" + indusry + \"','\" + exchange + \"')\"\n\n//pld = \"BULK INSERT [OCP_LOCAL].[ext].[Profile]\"\n//pld = pld + \" FROM '/data/ProfileMaster.csv'\"\n//pld = pld + \" WITH (\"\n//pld = pld + \"FIRSTROW=2,\"\n//pld = pld + \"LASTROW=5,\"\n//pld = pld + \"FIELDTERMINATOR=',',\"\n//pld = pld + \"TABLOCK\"\n//pld = pld + \")\"\nmsg.payload = pld\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":950,"y":200,"wires":[["aa88f3f752cb3e99"]]},{"id":"b1a99a1f10fd2aec","type":"debug","z":"1bf07b4d6f4c42cf","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"error","targetType":"msg","statusVal":"","statusType":"auto","x":1310,"y":260,"wires":[]},{"id":"461303971aa45e84","type":"delay","z":"1bf07b4d6f4c42cf","name":"","pauseType":"delay","timeout":"30","timeoutUnits":"seconds","rate":"1","nbRateUnits":"1","rateUnits":"second","randomFirst":"1","randomLast":"5","randomUnits":"seconds","drop":false,"allowrate":false,"x":740,"y":60,"wires":[["9752a07b71f0349e"]]},{"id":"712817f5220aab38","type":"csv","z":"1bf07b4d6f4c42cf","name":"csv-parse","sep":",","hdrin":true,"hdrout":"all","multi":"one","ret":"\\r\\n","temp":"CompanyName,ExchangeCode,Industry,Exchange,_seen","skip":"0","strings":true,"include_empty_strings":true,"include_null_values":true,"x":580,"y":100,"wires":[["461303971aa45e84"]]},{"id":"df8c0b88.91b0a8","type":"MSSQL-CN","tdsVersion":"7_4","name":"aws","server":"${SQL_SERVER_URL}","port":"${SQL_SERVER_PORT}","encyption":false,"trustServerCertificate":true,"database":"OCP_LOCAL","useUTC":false,"connectTimeout":"60000","requestTimeout":"0","cancelTimeout":"0","pool":"100","parseJSON":false,"enableArithAbort":true,"credentials":{}}]
I get this error when passing Columns parameter from specific msg.xx
this is the content of the msg.complete
{"paramQuery": [{"output":false, "name":"idEsecuzioneAttivita","type":"int"}, {"output":false,"name":"idUtente","type":"int"}, {"output":false,"name":"Utente","type":"nvarchar"}, {"output":false,"name":"Data","type":"date"}, {"output":false,"name":"OraInizio","type":"nvarchar"}, {"output":false,"name":"OraFine","type":"nvarchar"}, {"output":false,"name":"Minuti","type":"int"}, {"output":false,"name":"CodiceProgetto","type":"nvarchar"}, {"output":false,"name":"idCliente","type":"int"}, {"output":false,"name":"RagioneSociale","type":"nvarchar"}, {"output":false,"name":"idProgetto","type":"int"}, {"output":false,"name":"Progetto","type":"nvarchar"}, {"output":false,"name":"idAttivita","type":"int"}, {"output":false,"name":"Attivita","type":"nvarchar"}, {"output":false,"name":"idTipoAttivita","type":"int"}, {"output":false,"name":"TipoAttivita","type":"nvarchar"}, {"output":false,"name":"Numero","type":"float"}, {"output":false,"name":"TariffaAttivita","type":"float"}, {"output":false,"name":"idLuogoEsecuzioneAttivita","type":"int"}, {"output":false,"name":"LuogoEsecuzioneAttivita","type":"nvarchar"}, {"output":false,"name":"CostoAttivita","type":"float"}, {"output":false,"name":"CostoOrario","type":"float"}, {"output":false,"name":"Note","type":"nvarchar"}, {"output":false,"name":"idSettore","type":"int"}, {"output":false,"name":"Settore","type":"nvarchar"}, {"output":false,"name":"idAreaBusiness","type":"int"}, {"output":false,"name":"AreaBusiness","type":"nvarchar"}, {"output":false,"name":"idTipoProgetto","type":"int"}, {"output":false,"name":"TipoProgetto","type":"nvarchar"}, {"output":false,"name":"processato","type":"tinyint"}], "formattedData":[ ["1779763","14280","Pablo Picasso","23/02/2021","09:00","13:00","240","0110018","43682","XXX S.P.A.","60367","XXX AM","80925","XXXXX AM","17803","Sviluppo","","150,00","3727","Ufficio","","","x","","","668","XXX","","",0] ],"_msgid":"71a8d293.c9817c"}
Could you please help me if it is an issue or what i'm doing wrong?
Hi! When I try to configure a node to connect to the MSSQL database, I get this error on deploy:
"TypeError: sql.ConnectionPool is not a constructor"
Any hint as to what to look for? Thank you very much!
When bulk inserting into a predefined table with a primary key, the insert fails and the following error is returned:
Invalid column type from bcp client for colid 1.
Column types used were NVARCHAR(255)
The whole thing worked fine if I didn't have a pre-existing table, or the pre-existing table didn't have a primary key.
Hi,
I'm using mssql-plus 0.6.4 version.
i could not connect to sql using env variable. This is helpful for me to connect to different db located in the different location. I tried to create a sub flow for sql that would help me reuse the same flow across different locations with different servers.
It throws me an errr message
code: "ESOCKET"
message: "Failed to connect to :1433 - Could not connect (sequence)
you help would be really appreciable
I've attached the flow with subflow
[{"id":"ebc85c42.463a8","type":"subflow","name":"SQLPlus064","info":"","category":"","in":[{"x":100,"y":80,"wires":[{"id":"bf1289cd.07fcb8"}]}],"out":[{"x":300,"y":80,"wires":[{"id":"bf1289cd.07fcb8","port":0}]}],"env":[{"name":"ServerName","type":"str","value":"10.1.2.111"},{"name":"UserName","type":"str","value":"appliUser"},{"name":"Password","type":"str","value":"1234556"},{"name":"DBName","type":"str","value":"DB_DEV"}],"color":"#DDAA99"},{"id":"bf1289cd.07fcb8","type":"MSSQL","z":"ebc85c42.463a8","mssqlCN":"c29068d1.97ef38","name":"","outField":"payload","returnType":0,"throwErrors":1,"query":"Select TOP 10 * FROM TestBenchResult","modeOpt":"","modeOptType":"query","queryOpt":"","queryOptType":"editor","paramsOpt":"","paramsOptType":"none","params":[],"x":200,"y":80,"wires":[[]]},{"id":"c29068d1.97ef38","type":"MSSQL-CN","z":"ebc85c42.463a8","tdsVersion":"7_4","name":"DB-Con","server":"\"ServerName\"","port":"","encyption":true,"trustServerCertificate":true,"database":"ShopfloorDB_DEV","useUTC":false,"connectTimeout":"50000","requestTimeout":"50000","cancelTimeout":"50000","pool":"5","parseJSON":false,"enableArithAbort":true},{"id":"c81636eb.e7d248","type":"tab","label":"MSSQLPlus-CheckSub","disabled":false,"info":""},{"id":"7c1a36cd.c54a88","type":"inject","z":"c81636eb.e7d248","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":120,"y":100,"wires":[["30366732.3efba8"]]},{"id":"de6a1325.7c759","type":"debug","z":"c81636eb.e7d248","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":440,"y":100,"wires":[]},{"id":"30366732.3efba8","type":"subflow:ebc85c42.463a8","z":"c81636eb.e7d248","name":"","env":[{"name":"ServerName","value":"10.1.2.111","type":"env"},{"name":"Password","value":"123456789","type":"str"}],"x":300,"y":80,"wires":[["de6a1325.7c759"]]}]
Thanks
Ramesh R
change password of my previous account to: "123456789password" --> it worked--> no issue with my account's role or permission.
add "@" to my pass: "123456789password@" --> it doesn't work any more --> may be some issue if there is character "@" in password.
I've got a clustered database to connect to, using the FailoverPartner attribute in the connection string, detailed here : https://www.connectionstrings.com/sqlconnection/database-mirroring/
Is there a way to do this ?
Thanks
Simon
Hi,
I try use this node with MSSQL 2017 and JSON feature. Problem is that MSSQL add MS specific prefix to JSON result. Like below. String is always same.
"JSON_F52E2B61-18A1-11d1-B105-00805F49916B": "{\"ProductCode\":\"0040001\",\"ProductName\":\"Brother DK11209 osoitetarra 29x62mm\"}"
It changes JSON to JavaScript Objects says Nick O'Leary, see thread
https://discourse.nodered.org/t/http-response-json-without-backslashes/19376/7?u=timnis
In node-mssql there is option "config.parseJSON = true" to strip out this MS prefix, could it be also possible to add to this node?
More info
https://tediousjs.github.io/node-mssql/#json-support
In Node documentation you write "You can use environment variables in any connection field, using mustache format."
This works fine for connection information stored in flow.json but not for user and password.
My unencrypted flows_cred.json looks like
{"7cd6f15f.369f7":{"username":"{{{DB_USER}}}","password":"{{{DB_PASSWORD}}}"}}
When trying to connect, I get the following errormessage:
Error connecting to server : 172.16.3.164, database : ASP, port : 1433, user : {{{DB_USER}}}
So it looks like there is no mustache token replacement for credentials. Values for server, database and port are set correctly via env.
Firstly, thanks so much for your fantastic work.
I wanted to see how this node performed, and so I tried a simple test with 50,000 rows, however had to limit things. 1000 rows were inserted using a TVP fairly quickly (about a second or so), however more than that seemed to get slower exponentially.
I guess that perhaps the slowness is coming from actually building the sql table before inserting it. Perhaps you may have some insights as to how to increase performance.
Here's the test:
I setup two tables TempSource
and TempDestination
, a table type, and a stored proc to populate the TempDestination
table. I also populated 49,999 rows of dummy data into TempSource
:
-- Setup some testing tables
CREATE TABLE TempSource (
Id INT PRIMARY KEY,
Name NVARCHAR(2000)
)
GO
CREATE TABLE TempDestination (
Id INT PRIMARY KEY,
Name NVARCHAR(2000)
)
GO
-- Insert values into the source
SET NOCOUNT ON
DECLARE @Counter INT = 10000
BEGIN TRANSACTION
WHILE @Counter < 50000
BEGIN
INSERT INTO TempSource VALUES(@Counter, 'The Object Name ' + CAST(@Counter AS NVARCHAR(20)))
SET @Counter = @Counter + 1
END
COMMIT
-- Create Table Type
CREATE TYPE TempData AS TABLE (
Id INT PRIMARY KEY,
Name NVARCHAR(2000)
)
GO
-- Create procedure to 'Upsert'
-- Actually for now it just truncates and re-populates.
CREATE PROCEDURE procUpsertTempDestination
@Data dbo.TempData READONLY
AS
BEGIN
TRUNCATE TABLE TempDestination
INSERT INTO TempDestination
SELECT * FROM @Data
END
I then setup the following flow (which also used some JSONata transform to adjust the data, as I was testing the performance of this also):
[
{
"id": "dd45cc9.283d83",
"type": "tab",
"label": "Flow 1",
"disabled": false,
"info": ""
},
{
"id": "184967eb.124df8",
"type": "MSSQL",
"z": "dd45cc9.283d83",
"mssqlCN": "f288f4bc.61043",
"name": "",
"outField": "payload",
"returnType": 0,
"throwErrors": 1,
"query": "SELECT TOP 5000 *\nFROM TempSource",
"modeOpt": "",
"modeOptType": "query",
"queryOpt": "",
"queryOptType": "editor",
"paramsOpt": "",
"paramsOptType": "editor",
"params": [],
"x": 360,
"y": 80,
"wires": [
[
"f92b847c.535cb8"
]
]
},
{
"id": "cbe8113e.97571",
"type": "debug",
"z": "dd45cc9.283d83",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "false",
"statusVal": "",
"statusType": "auto",
"x": 890,
"y": 80,
"wires": []
},
{
"id": "569a0c98.c79404",
"type": "inject",
"z": "dd45cc9.283d83",
"name": "",
"props": [
{
"p": "payload"
},
{
"p": "topic",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "",
"payloadType": "date",
"x": 170,
"y": 80,
"wires": [
[
"184967eb.124df8"
]
]
},
{
"id": "f92b847c.535cb8",
"type": "change",
"z": "dd45cc9.283d83",
"name": "",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "(\t $rows := msg.payload.(\t [\t [Id, Name & \" Some concatenated value \" & Id]\t ]\t );\t {\t \"columns\" : [\t {\"name\" : \"Id\", \"type\" : \"Int\"},\t {\"name\" : \"Name\", \"type\" : \"NVarChar(2000)\"}\t ],\t \"rows\" : $rows\t };\t)",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 580,
"y": 80,
"wires": [
[
"cbe8113e.97571",
"18dec6ec.7177a9"
]
]
},
{
"id": "18dec6ec.7177a9",
"type": "MSSQL",
"z": "dd45cc9.283d83",
"mssqlCN": "f288f4bc.61043",
"name": "",
"outField": "payload",
"returnType": 0,
"throwErrors": 1,
"query": "procUpsertTempDestination",
"modeOpt": "",
"modeOptType": "execute",
"queryOpt": "",
"queryOptType": "editor",
"paramsOpt": "",
"paramsOptType": "editor",
"params": [
{
"output": false,
"name": "Data",
"type": "TVP(dbo.TempData)",
"valueType": "msg",
"value": "payload"
}
],
"x": 900,
"y": 140,
"wires": [
[
"20300723.19c61"
]
]
},
{
"id": "20300723.19c61",
"type": "debug",
"z": "dd45cc9.283d83",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 1010,
"y": 240,
"wires": []
},
{
"id": "f288f4bc.61043",
"type": "MSSQL-CN",
"z": "",
"tdsVersion": "7_4",
"name": "",
"server": "sqldata",
"port": "1433",
"encyption": true,
"database": "sdb",
"useUTC": true,
"connectTimeout": "30000",
"requestTimeout": "30000",
"cancelTimeout": "5000",
"pool": "50",
"parseJSON": true,
"enableArithAbort": true
}
]
Note that the first SQL node has a TOP 5000
limit in the query - this can be removed to get the full 49999 records for testing.
Thanks again!
Hi
i've no success to connect to a linux ms sql server in a docker container
besides, i can connect from a windows client to the ms sql server and also from Azure Data Studio (MacOS)
what i noticed is, that the windows client shows me no instance name for the linux ms sql server, just a servername (mssqlserver)
that page says, that the linux version has no instance name:
https://stackoverflow.com/questions/41695344/how-can-i-create-named-instance-of-microsoft-sql-server-on-ubuntu
could that be the problem?
error msg with instance name 'mssqlserver': Failed to connect to ip\mssqlserver
error msg w/o an instance name: invalid syntax near '-'.
thanks
At first glance I don't see the ability to define the ApplicationIntent. This is needed for Availability Groups with read-only replicas. The connection string value would be "ApplicationIntent=ReadOnly". I don't mind working on a PR as I believe this is supported in Tedious, but want to make sure I'm not overlooking the ability to do this currently.
If a error occurs on a bulk insert (e.g. if you try to insert a invalid date into a DateTime Column) then the Node's error handling will not be triggered and the Node-Red Runtime will crash.
Here is the error message
16 Aug 08:56:38 - [red] Uncaught Exception:
16 Aug 08:56:38 - TypeError: Invalid date value passed to bulk rows
at Table._makeBulk (/data/node_modules/mssql/lib/table.js:69:21)
at Immediate.<anonymous> (/data/node_modules/mssql/lib/tedious/request.js:216:13)
at processImmediate (internal/timers.js:464:21)
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! [email protected] start: `node $NODE_OPTIONS node_modules/node-red/red.js $FLOWS "--userDir" "/data"`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the [email protected] start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /data/.npm/_logs/2021-08-16T17_56_38_410Z-debug.log
Hi,
How can specify port number and instance name in the connection node? I see there was a port field in previous version, some one asked to make it optional, but it's no longer available in the latest version!
note that I connect to database using this server name ([server-ip][instance name],[port number]) but that format not supported in this node!
Thank You
Ameen
Hello,
the version of the jsonwebtoken library which is used by your node has a security vulnerability.
It is recommended to use the newest version of the library.
Can you please fix this vulnerability?
Links:
[https://nvd.nist.gov/vuln/detail/CVE-2022-23529]
Thank you in advance.
Hi There, I see that the payload.Name
doesn't get escaped before inserting into the database:
INSERT INTO TempDestination VALUES ({{{payload.Id}}}, '{{{payload.Name}}}')
For instance, if we have payload.Name
containing a first character of '
, then the payload.Name
is populated into the database as an empty string.
Consider adding support for decimal precision and scale
example...
request.addParameter('value', Decimal, 18728.4, { precision: 16, scale: 2 });
Currently, it looks like tedious is defaulting to decimal(18,2) meaning loss of precision.
Hello,
Do you have any plans to provide support for both the Native V8 driver for MSSQL alongside with the current one (Tedious)?
Im interested in using the Native version, so if you are not currently work on this, can we fork and add this functionality, or would you consider a PR?
Thanks.
Hi,
Just a quick suggestion I'd love to see it being implemented.
Add the ability to handle multiple SELECT queries, e.g.
msg.payload =
SELECT * FROM Customers;
SELECT * FROM CustomersDetails;
In Studio Management or Navicat this will execute 2 SELECT queries and return each one.
Would be great to have a similar behaviour here, maybe having the node return these as an array:
msg.payload = [
[query 1 results array],[query 2 results array]
]
I am receiving this error message:
17 Aug 08:29:22 - [info] [MSSQL-CN:SQLSExpress2019] Error connecting to server : localhost\SQLEXPRESS, database : NodeRedTest, port : 1433, user :
ConnectionError: Login failed for user ''.
The MSSQL-CN doesn't appear to be saving or rather reading the login credentials once deployed. Before I deploy, if I check the credentials they are there, but after deploying they are gone. I see an encrypted value in the flows__cred.json file.
I have this working on my work machine just fine (windows 10), but for some reason on my home dev box (windows 10) is not reading the info back in and thus not passing the login upon running the flow.
I've done the following so far:
Obviously, it is something on my home development machine, but any suggestions would be helpful.
Thank you,
Greg
Hi,
Is there any way of supporting the execution of stored procedures.
I notice in the Node.JS MSSQL that stored procedures are called in a different way, is there support for it node-red-contrib-mssql-plus.
Best Regards,
Glyn
Recently forced to move from age old node-red install version (think 0.something) and node-red-contrib-mssql.
Flows imported fine but with node-red-contrib-mssql no longer maintained (deleted?) we have moved to node-red-contrib-mssql-plus. Now we see where concurrent table reads/writes work in the older Node they fail in mssql-plus.
A few of our flows for example read from multiple tables in a single DB, then join the results for an external report or email.
Sorry for perhaps being a noob question, but how can I setup a common connection that opens in the beginning of a flow. Will be used for a lot of operations/queries and then closed at the end of the flow. I cannot find an example and honestly don't know how to implement it. I cannot even find the CN-node in my palette (it shows up as installed but I cannot find it to drag it into my flow). Have tried in Azure web app, Azure Ubuntu VM and on my Home Assistant with the same result :-( Can I be missing some prerequisite
?
The ReadMe states the node it is based on, but doesn't say what it does that the other one doesn't.
What can I do in your node that I can't do in the other?
I've recently updated from 0.3.2. to 0.5.0. and noticed the query editor portion of the node settings has shrunk significantly. This appears to be because the sidebar leaves space for the parameter 'editor' mode in 0.5.0, even when it isn't visible. It seems like the oneditresize
function doesn't take into account whether the second editor is visible and leaves space for it regardless. This makes it hard to deal with more complex queries.
Below are screenshots of 0.5.0 and 0.3.2
Hi @bestlong , contributers and anyone passing...
I have added a branch called params
The purpose of these modification is 2 fold...
See this thread for some additional insight
The UI has numerous changes to permit static or dynamic entry of parameters.
I have tested the changes in node-red of several machines and the user beta testing has (almost) got it working on his machine.
If any one could test and feedback that would be great.
Install -
This is a demo flow...
[{"id":"3eb71b1f.47fdb4","type":"MSSQL","z":"595a5dd5.a963a4","mssqlCN":"a51e405c.10f64","name":"","query":"MyCustomStoredProcedure","outField":"payload","returnType":"1","throwErrors":"0","queryMode":"execute","params":[{"output":false,"name":"tvp","type":"TVP(TestType)","valueType":"json","value":"{\"columns\":[{\"name\":\"a\",\"type\":\"VarChar(50)\"},{\"name\":\"b\",\"type\":\"Int\"}],\"rows\":[[\"hello tvp\",777],[\"bye tvp\",888],[\"call the cops\",999]]}"}],"x":500,"y":520,"wires":[["bfde3540.a91018"]]},{"id":"614325ad.afd22c","type":"inject","z":"595a5dd5.a963a4","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":500,"y":480,"wires":[["3eb71b1f.47fdb4"]]},{"id":"bfde3540.a91018","type":"debug","z":"595a5dd5.a963a4","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":510,"y":580,"wires":[]},{"id":"a51e405c.10f64","type":"MSSQL-CN","z":"","tdsVersion":"7_4","name":"Local SQL","server":"192.168.99.99","port":"1433","encyption":false,"database":"testdb","useUTC":false,"connectTimeout":"15000","requestTimeout":"15000","cancelTimeout":"5000","pool":"5","parseJSON":false}]
I have a local install of mssql express but I cannot connect. I tried windows authentication, then I tried creating a user, but I cannot connect either way. I have checked that mssql express service is running, and I even set the TCP/IP port to 1433, not that this should matter. So far I have not found a way to connect. To get started, I just want to create an inject node with a simple insert query into an existing table. Can you help?
Hi Steve,
Thank you for your response and real apologies for not reverting you sooner. As we had to go for demo, we used the static file load at the time of starting DB and progressed to other places.
Back to bulk insert now and this looks pretty good. I'm generating an array of around 98000+ records and pushing it in sql-server via batch mode. Array does get created quite quickly though while pushing the data in sql, it's throwing:
Invalid column type from bcp client for colid 2.
Which seems a bummer as I'm creating table along with the bulk insert, which means schema is exactly the same. Kept all my fields as nullable too so it shouldn't be the issue. Would you have any recommendation to look for in fixing this issue?
Just a comment - I noticed that there is now this available: https://github.com/tediousjs/node-mssql/tree/v7.0.0-beta.3
In-case you weren't aware
Hi, I cannot find this in the documentation - what is it for?
Hi bestlong!
Sorry for bothering you again, but you are the only one who is still out there on mssql for node-red. - So your work is most appreciated!
I've just noticed, that a catch-node does not catch erros of a mssql node, maybe you could implement to throw an exception by any chance?
BR
pate
Hi,
in the latest version, the port attribute is mandatory.
I guess 99% of all SQL server use named instances, where ports are not being used.
Could you please set this attribute optional again, as it throws configuration errors during deployment?
Thank you and best regards
Pate
ignore
First of all. Great work with this node. Easy to use and still versatile.
I might however have push it to it's limit in this scenario and like to discuss it.
This is the scenario that im testing.
I want to be able to run a query for each row (object in my array) but im facing the issue
Resource ID : 1. The request limit for the database is 30 and has been reached. See 'http://go.microsoft.com/fwlink/?LinkId=267637' for assistance.
From what i can understand the node is opening a connection for each query that runs and that would totally make sense.
In this case it does however create problems with limits towards Azure.
What i think could solve this problem would be if we actually open the connection --> run alla queries --> close connection.
Something like this
I have found a couple of workarounds like concatenate the complete query and then run. That technically solves the issue but makes the flow harder to follow and maintain.
Is there a way to control the opening and closing of the connection manually?
A example flow to recreate the issue
flows.zip
Hi,
I'm feeling like a complete noob and I'm sure it's me missing something silly but for the life on me,I can't connect to a SQL server with this node.
I have a "remote" SQL server I can access with Navicat with sql.mydomain.com\instance,50002 but failing to translate this into node config.
I've tried with
server: sql.mydomain.com\instance
port: 50002
and
server: sql.mydomain.com\instance,50002
port: 1433
but all I get is timeout errors...
Can someone give me a hand please?
Hi, I wonder if there are any users of the MSSQL-PLUS node would be willing to assist in translating the 2 following files...
https://github.com/bestlong/node-red-contrib-mssql-plus/blob/i18n/src/locales/en-US/mssql.json
https://github.com/bestlong/node-red-contrib-mssql-plus/blob/i18n/src/locales/en-US/mssql.html
I would accept a PR or even post translations in a reply here & I will integrate them.
Thanks.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.