Syntax issue in my SQL Server Stored Procedure with a BIT value type - sql

I am trying to insert an xmlString value and bit value of 1 into the following stored procedure:
ALTER PROCEDURE [dbo].[sbssp_ArchivedMessages]
(
#xmlString varchar(max),
#fromToMach bit
)
AS
BEGIN
DECLARE #idoc int, #lastId int
EXEC sp_xml_preparedocument #idoc OUTPUT, #xmlString, #fromToMach
INSERT INTO [dbo].[tblArchivedMessages]
SELECT * FROM OPENXML(#idoc, '/Mach', 2) WITH [dbo].[tblArchivedMessages]
SET #lastId = (SELECT IDENT_CURRENT('tblArchivedMessages'))
UPDATE [dbo].[tblArchivedMessages]
SET FromToMach = #fromToMach
WHERE ID = #lastId
END
When I execute the SP I am doing so as follows:
EXEC dbo.sbssp_InsertArchivedMessages '<MACH><B000>StringVal</B000><B002>StringVal</B002><B003>StringVal</B003><B004>StringVal</B004><B007>StringVal</B007><B011>StringVal</B011><B012>StringVal</B012><B013>StringVal</B013><B015>StringVal</B015><B018>StringVal</B018><B028>StringVal</B028><B032>StringVal</B032><B037>StringVal</B037><B039>StringVal</B039><B041>StringVal</B041><B043>StringVal</B043><B048>StringVal</B048><B049>StringVal</B049><B058>StringVal</B058><B061>StringVal</B061><B063>StringVal</B063><B127>StringVal</B127></MACH>', 1
This is the error I'm getting:
Msg 515, Level 16, State 2, Procedure sbssp_InsertArchivedMessages,
Line 13
Cannot insert the value NULL into column 'FromToMach', table
'MachoPOSt.dbo.ArchivedMessages'; column does not allow nulls. INSERT
fails. The statement has been terminated.
Any suggestions on what exactly I'm doing wrong? I've also put the #variable names in front of each value but still get the same error.
Any help/direction would be appreciated. Thanks.

You are not populating one of the columns
I am not sure what the table looks like but the problem is this
INSERT INTO [dbo].[tblArchivedMessages]
SELECT * FROM OPENXML(#idoc, '/ATM', 2) WITH [dbo].[tblArchivedMessages]
The problem is the value that you pass into the FromToATM column

#fromToMatch shouldn't be supplied as the last parameter of the sp_xml_preparedocument stored procedure.
That param is for an xPath Namespace, which you do not appear to have any of in your sample XML, so there is no value required for this parameter in this situation.
Also, XML is CASE SensiTive, so in your OPENXML, change "Mach" to "MACH".
Without having the DDL for any of the tables involved, I can't accurately simulate it on my system, but give this a try:
EXEC sp_xml_preparedocument
#idoc OUTPUT,
#xmlString;
INSERT INTO [dbo].[tblArchivedMessages]
--(really should list columns here)
SELECT
--really should list columns here
--instead of
*
FROM OPENXML(#idoc, '/MACH', 2)
WITH [dbo].[tblArchivedMessages];
SET #lastId = SCOPE_IDENTITY();
EXEC sp_xml_removedocument
#idoc; --never a bad idea to clean up!
UPDATE [dbo].[tblArchivedMessages] SET
FromToMach = #fromToMach
WHERE
ID = #lastId;
Give'er a try, see if it works.
If not, script your "tblArchivedMessages" table, and post the DDL.
We'll get it working, one way or the other!
Cheers!
(Incidentally, this code DOES appear to work as is on my machine):
DECLARE
#idoc int,
#lastId int,
#xmlString varchar(max),
#fromToMach bit
SET #xmlString =
'<MACH><B000>StringVal</B000><B002>StringVal</B002><B003>StringVal</B003><B004>StringVal</B004><B007>StringVal</B007><B011>StringVal</B011><B012>StringVal</B012><B013>StringVal</B013><B015>StringVal</B015><B018>StringVal</B018><B028>StringVal</B028><B032>StringVal</B032><B037>StringVal</B037><B039>StringVal</B039><B041>StringVal</B041><B043>StringVal</B043><B048>StringVal</B048><B049>StringVal</B049><B058>StringVal</B058><B061>StringVal</B061><B063>StringVal</B063><B127>StringVal</B127></MACH>';
SET #fromToMach = 1;
EXEC sp_xml_preparedocument
#idoc OUTPUT,
#xmlString;
SELECT
--really should list columns here
--instead of
*
FROM OPENXML(#idoc, '/MACH', 2)
WITH
(
B000 VARCHAR(100),
B001 VARCHAR(100),
B002 VARCHAR(100),
B003 VARCHAR(100),
B004 VARCHAR(100),
B005 VARCHAR(100),
B006 VARCHAR(100),
B007 VARCHAR(100),
B008 VARCHAR(100),
B009 VARCHAR(100),
B010 VARCHAR(100),
B011 VARCHAR(100),
B012 VARCHAR(100),
B013 VARCHAR(100),
B014 VARCHAR(100),
B015 VARCHAR(100),
B016 VARCHAR(100),
B017 VARCHAR(100),
B018 VARCHAR(100),
B019 VARCHAR(100),
B020 VARCHAR(100),
B021 VARCHAR(100),
B022 VARCHAR(100),
B023 VARCHAR(100),
B024 VARCHAR(100),
B025 VARCHAR(100),
B026 VARCHAR(100),
B027 VARCHAR(100),
B028 VARCHAR(100),
B029 VARCHAR(100),
B030 VARCHAR(100),
B031 VARCHAR(100),
B032 VARCHAR(100),
B033 VARCHAR(100),
B034 VARCHAR(100),
B035 VARCHAR(100),
B036 VARCHAR(100),
B037 VARCHAR(100),
B038 VARCHAR(100),
B039 VARCHAR(100),
B040 VARCHAR(100),
B041 VARCHAR(100),
B042 VARCHAR(100),
B043 VARCHAR(100),
B044 VARCHAR(100),
B045 VARCHAR(100),
B046 VARCHAR(100),
B047 VARCHAR(100),
B048 VARCHAR(100),
B049 VARCHAR(100),
B050 VARCHAR(100),
B051 VARCHAR(100),
B052 VARCHAR(100),
B053 VARCHAR(100),
B054 VARCHAR(100),
B055 VARCHAR(100),
B056 VARCHAR(100),
B057 VARCHAR(100),
B058 VARCHAR(100),
B059 VARCHAR(100),
B060 VARCHAR(100),
B061 VARCHAR(100),
B062 VARCHAR(100),
B063 VARCHAR(100),
B064 VARCHAR(100),
B065 VARCHAR(100),
B066 VARCHAR(100),
B067 VARCHAR(100),
B068 VARCHAR(100),
B069 VARCHAR(100),
B070 VARCHAR(100),
B071 VARCHAR(100),
B072 VARCHAR(100),
B073 VARCHAR(100),
B074 VARCHAR(100),
B075 VARCHAR(100),
B076 VARCHAR(100),
B077 VARCHAR(100),
B078 VARCHAR(100),
B079 VARCHAR(100),
B080 VARCHAR(100),
B081 VARCHAR(100),
B082 VARCHAR(100),
B083 VARCHAR(100),
B084 VARCHAR(100),
B085 VARCHAR(100),
B086 VARCHAR(100),
B087 VARCHAR(100),
B088 VARCHAR(100),
B089 VARCHAR(100),
B090 VARCHAR(100),
B091 VARCHAR(100),
B092 VARCHAR(100),
B093 VARCHAR(100),
B094 VARCHAR(100),
B095 VARCHAR(100),
B096 VARCHAR(100),
B097 VARCHAR(100),
B098 VARCHAR(100),
B099 VARCHAR(100),
B100 VARCHAR(100),
B101 VARCHAR(100),
B102 VARCHAR(100),
B103 VARCHAR(100),
B104 VARCHAR(100),
B105 VARCHAR(100),
B106 VARCHAR(100),
B107 VARCHAR(100),
B108 VARCHAR(100),
B109 VARCHAR(100),
B110 VARCHAR(100),
B111 VARCHAR(100),
B112 VARCHAR(100),
B113 VARCHAR(100),
B114 VARCHAR(100),
B115 VARCHAR(100),
B116 VARCHAR(100),
B117 VARCHAR(100),
B118 VARCHAR(100),
B119 VARCHAR(100),
B120 VARCHAR(100),
B121 VARCHAR(100),
B122 VARCHAR(100),
B123 VARCHAR(100),
B124 VARCHAR(100),
B125 VARCHAR(100),
B126 VARCHAR(100),
B127 VARCHAR(100)
)
SET #lastId = SCOPE_IDENTITY();
EXEC sp_xml_removedocument
#idoc; --never a bad idea to clean up!

Related

In my stored procedure insert into two different tables with if else condition

create procedure sp_student
#student varchar(50);
as
if (#student = marks)
begin
insert into marks
values (student_id int not null, terms varchar(10), subject1 varchar(100), subject2 varchar(100), total varchar(100))
end
else (#student = students)
begin
insert into students
values(student_id int not null, student_name varchar(100), student_age int, mobile_no varchar(20))
end
I didn't get a answer above I mentioned query.
Too many errors. Such a number of errors makes me feel, that you don't really use IBM Db2 product...
create procedure sp_student (
#student varchar(50),
#student_id int,
#terms varchar(10),
#subject1 varchar(100),
#subject2 varchar(100),
#total varchar(100),
#student_name varchar(100),
#student_age int,
#mobile_no varchar(20)
)
BEGIN
if (#student = 'marks') then
insert into marks
values (#student_id, #terms, #subject1 , #subject2 , #total);
elseif (#student = 'students') then
insert into students
values (#student_id ,#student_name, #student_age, #mobile_no);
end if;
END
fiddle
you can't set dataType in value(..) :
create procedure sp_student
#student varchar(50),
#student_id int,
#terms varchar(10),
#subject1 varchar(100),
#subject2 varchar(100),
#total varchar(100),
#student_name varchar(100),
#student_age int,
#mobile_no varchar(20)
as
if (#student = 'marks') then
insert into marks
values (#student_id, #terms, #subject1 , #subject2 , #total);
elseif (#student = 'students') then
insert into students
values (#student_id ,#student_name, #student_age, #mobile_no);
end if;
end

xml response with diff nodes level into sql table

I'm using API that gives the following response:
<events><item0><PermitId>705130</PermitId><UserID>389230</UserID><CarID>348729</CarID><StartDate>2022-11-22</StartDate><EndDate>2022-11-22</EndDate><RequestDate>2022-02-22</RequestDate><PermitName>Leisure Visit</PermitName><ExpectedTime>13</ExpectedTime><Companions>6</Companions><StatusID>1</StatusID><Status>Active</Status><City>Makkah</City></item0>
<item1><PermitId>846926</PermitId><UserID>281556</UserID><CarID>403407</CarID><StartDate>2022-10-23</StartDate><EndDate>2022-12-31</EndDate><RequestDate>2022-10-23</RequestDate><PermitName>Yearly Permit</PermitName><ExpectedTime>0</ExpectedTime><Companions>0</Companions><StatusID>1</StatusID><Status>Active</Status><City>Jeddah</City></item1></events>
How can I insert it into Sql table using sql?
I have tried the way but it didn't work for me
SELECT *
FROM
OPENXML(#xml,'//*')
WITH (
[PermitId] int,
[UserID] int,
[CarID] nvarchar(50),
[StartDate] date,
[EndDate] date,
[RequestDate] date,
[PermitName] nvarchar(100),
[ExpectedTime] int,
[Companions] int,
[StatusID] int,
[Status] nvarchar(100),
[City] nvarchar(100));
You had it almost right.
But you need to cappture all items so you need '/events/*'
And also vital the last parameter 2, which takes the sublelemts as rows
DECLARE #idoc INT, #doc VARCHAR(1000);
SET #doc ='
<events>
<item0>
<PermitId>705130</PermitId>
<UserID>389230</UserID>
<CarID>348729</CarID>
<StartDate>2022-11-22</StartDate>
<EndDate>2022-11-22</EndDate>
<RequestDate>2022-02-22</RequestDate>
<PermitName>Leisure Visit</PermitName>
<ExpectedTime>13</ExpectedTime>
<Companions>6</Companions>
<StatusID>1</StatusID>
<Status>Active</Status>
<City>Makkah</City>
</item0>
<item1><PermitId>846926</PermitId><UserID>281556</UserID><CarID>403407</CarID><StartDate>2022-10-23</StartDate><EndDate>2022-12-31</EndDate><RequestDate>2022-10-23</RequestDate><PermitName>Yearly Permit</PermitName><ExpectedTime>0</ExpectedTime><Companions>0</Companions><StatusID>1</StatusID><Status>Active</Status><City>Jeddah</City></item1></events>
';
--Create an internal representation of the XML document.
EXEC sp_xml_preparedocument #idoc OUTPUT, #doc;
-- Execute a SELECT statement that uses the OPENXML rowset provider.
SELECT *
FROM OPENXML (#idoc, '/events/*',2)
WITH ([PermitId] int ,
[UserID] int,
[CarID] nvarchar(50),
[StartDate] date,
[EndDate] date,
[RequestDate] date,
[PermitName] nvarchar(100),
[ExpectedTime] int,
[Companions] int,
[StatusID] int,
[Status] nvarchar(100),
[City] nvarchar(100));
PermitId
UserID
CarID
StartDate
EndDate
RequestDate
PermitName
ExpectedTime
Companions
StatusID
Status
City
705130
389230
348729
2022-11-22
2022-11-22
2022-02-22
Leisure Visit
13
6
1
Active
Makkah
846926
281556
403407
2022-10-23
2022-12-31
2022-10-23
Yearly Permit
0
0
1
Active
Jeddah
fiddle

Bulk insert and custom delimiters - (quote Separator - þ ) - (Column - ¶ )

I have search around but have not found anything that has worked in bulk inserting records into a SQL table.
I have tried different variation using characters, ASCII and HEX values without success. Each time generating an error. I usually perform alteration in Excel, but his file has over 5M records. This has to be possible, do anyone have a working solution or provide additional guidance ? Thank you in advance.
ERROR:
Msg 4866, Level 16, State 1, Line 110
The bulk load failed. The column is too long in the data file for row 1, column 1. Verify that the field terminator and row terminator are specified correctly.
Msg 7399, Level 16, State 1, Line 110
The OLE DB provider "BULK" for linked server "(null)" reported an error. The provider did not give any information about the error.
Msg 7330, Level 16, State 2, Line 110
Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".
Sample File
SQL Command
BULK INSERT [dbo].[AllTags]
FROM 'C:\Data\Swap Drive\File to import\01. Document Export\REL000001-REL296747\SAMPLE.DAT'
WITH (ROWTERMINATOR='\n',
MAXERRORS=0 ,
FIELDTERMINATOR='þ' ,
TABLOCK ,
CodePage='RAW'
)
It would have been helpful to post the correct table DDL, but here's a start:
drop table if exists #t
go
CREATE TABLE #t (
REFERENCEID varchar (100) ,
[BEGBATES] varchar (100) ,
[ENDBATES] varchar (100) ,
[BEGATTACH] varchar (100) ,
[ENDATTACH] varchar (100) ,
[PARENTBATES] varchar (100) ,
[ATTACHMENT] varchar (1000),
CUSTODIAN varchar(100),
DUPCUSTODIAN varchar(100),
[FROM] varchar(100),
[TO] varchar(100),
CC varchar(100),
BCC varchar(100),
SUBJECT varchar(100),
DATESENT varchar(100),
TIMESENT varchar(100),
DATERCVD varchar(100),
TIMERCVD varchar(100),
FILEEXT varchar(100),
AUTHOR varchar(100),
CREATEDATE varchar(100),
CREATETIME varchar(100),
DATELASTMOD varchar(100),
TIMELASTMOD varchar(100),
FILENAME varchar(100),
DUPFILENAME varchar(100),
FILELENGTH varchar(100),
PGCOUNT varchar(100),
DOCTYPE varchar(100),
FAMDATE varchar(100),
FAMTIME varchar(100),
TIMEZONE varchar(100),
PATH varchar(max),
DUPPATH varchar(max),
DEDUPHASH varchar(100),
NATIVEPATH varchar(100),
OCRPATH varchar(100),
TITLE varchar(100),
COMPANY varchar(100),
DATEACCESSED varchar(100),
TIMEACCESSED varchar(100),
DATEPRINTED varchar(100),
TIMEPRINTED varchar(100),
CONVDATE varchar(100),
CONVTIME varchar(100),
ATTACHLIST varchar(100),
FAMILYRANGE varchar(100),
ALLCUSTODIANS varchar(100),
ALLFILENAMES varchar(100),
ALLFILEPATHS varchar(max),
HASHMD5 varchar(100),
HASHSHA varchar(100),
TAGS varchar(100),
DOCNOTE varchar(100),
PRIVNOTE varchar(100),
REDACTRSNS varchar(100),
DISCOID varchar(100),
MESSAGEID varchar(100),
THREADID varchar(100),
ATTACHCOUNT varchar(100),
HIDDENTYPE varchar(100),
METAREDACTED varchar(100),
INREPLYTOID varchar(100),
OBJECTHASH varchar(100),
REVISION varchar(100),
HEADER varchar(100),
IMPORTANCE varchar(100),
DELIVERYRECEIPT varchar(100),
READRECEIPT varchar(100),
SENSITIVITY varchar(100),
LASTAUTHOR varchar(100),
ESUBJECT varchar(100),
DATEAPPTSTART varchar(100),
DATEAPPTEND varchar(100),
CALBEGDATE varchar(100),
CALENDDATE varchar(100),
CALBEGTIME varchar(100),
CALENDTIME varchar(100),
CALENDUR varchar(100),
RECORDTYPE varchar(100),
REVISIONNUMBER varchar(100),
Exception varchar(100),
ExceptionDetails varchar(100),
TextLimitExceeded varchar(100)
)
go
BULK INSERT #t
FROM 'C:\temp\test.DAT'
WITH (
FIRSTROW=2,
ROWTERMINATOR='0x0a',
MAXERRORS=0 ,
FIELDQUOTE =N'þ' ,
FIELDTERMINATOR = '0x14',
TABLOCK ,
CODEPAGE = '65001',
DATAFILETYPE = 'Char'
)
select * from #t
outputs
The UTF-8 þ (thorn) 0xC3BE used as a quote mark is not being stripped, and BULK INSERT doesn't support multi-byte FIELDQUOTE specified in binary.
So you'll have to strip that out, but it's a start.
BTW a good hex editor, like the one now available in VS Code is invaluable in cases like this.

Using int identity(1,1) as a way to join temporary tables

I'm rewriting a stored procedure that uses int identity(1,1) in >10 temp tables as a way to join these temp tables in the select statement. Below a shorter version of how how the code structure but in the stored procedure I'm editing there this structure is used to return data from each temp table.
CREATE TABLE #temp_MemberInfo
( RecID int identity(1,1),
MemberMBI varchar(13),
MemberName varchar(50),
MemberAddress varchar(150), -- DMP
MemberAddress2 varchar(100), -- DMP
MemberCity varchar(50),
MemberState varchar(3),
MemberZip varchar(11),
MemberMedicalRecordNo varchar(20),
MemberIsMale varchar(10),
MemberIsFemale varchar(10)
)
CREATE TABLE #temp_ProviderInfo
(
RecID int identity(1,1),
ProviderNPI varchar(13),
ProviderName varchar(60), -- DMP
ProviderAddress varchar(150), -- DMP
ProviderAddress2 varchar(100), -- DMP
ProviderCity varchar(40),
ProviderState varchar(3),
ProviderZip varchar(11),
ProviderTelephone varchar(15) )
Select *
from #temp_MemberInfo
Inner Join #temp_ProviderInfo on #temp_ProviderInfo.RecID = #temp_MemberInfo.RecID
The alternative I can think of would be to use an existing primary key in the date base but I would have to join an extra table in the update statements. Is this better from a performance standpoint? Are there other alternatives I'm not considering?

Stored Procedure in SQL Server 2008

I am trying to create a stored procedure but it is giving me an error while executing it.
Msg 156, Level 15, State 1, Procedure SignupUser, Line 13
Incorrect syntax near the keyword 'User'.
My stored procedure is:
CREATE PROCEDURE SignupUser
(
#FirstName nvarchar(25),
#LastName nvarchar(25),
#Email nvarchar(50),
#Password nvarchar(25),
#Mobile nvarchar(20),
#City nvarchar(25),
#StateProvince nvarchar(25),
#Country nvarchar(25),
#Type nvarchar(1),
#DateOfJoining Datetime
)
AS
INSERT INTO User
(
FirstName,LastName,Email,Password,
Mobile,City,StateProvince,Country,Type,DateOfJoining
)
VALUES
(
#FirstName,#LastName,#Email,#Password,
#Mobile,#City,#StateProvince,#Country,#Type,#DateOfJoining
)
USER is a reserved keyword in SQL Server. Use square brackets around it:
CREATE PROCEDURE SignupUser
(
#FirstName nvarchar(25),
#LastName nvarchar(25),
#Email nvarchar(50),
#Password nvarchar(25),
#Mobile nvarchar(20),
#City nvarchar(25),
#StateProvince nvarchar(25),
#Country nvarchar(25),
#Type nvarchar(1),
#DateOfJoining Datetime
)
AS
INSERT INTO [User]
(
FirstName,LastName,Email,Password,
Mobile,City,StateProvince,Country,Type,DateOfJoining
)
VALUES
(
#FirstName,#LastName,#Email,#Password,
#Mobile,#City,#StateProvince,#Country,#Type,#DateOfJoining
)
end
USER is a keyword in SQL you need to put brackets around table or column names are are keywords in SQL. Like this:
[USER] or [GRANT]