I have to do this:
Take this #HTML and save to file example.txt
example.txt save to .zip with password
.zip file convert to blob and stored into table
Do you know how to do it only in T-SQL? Is it possible?
DECLARE #HTML varchar(200)
SET #HTML = '<html>
<META http-equiv=Content-Language content=pl>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-2">
<body style="color:black; font-family: verdana, arial, helvetica, sans-serif; font-size:11px;">
TEST</body></html>'
SELECT #HTML
Using something like this?
EXEC sp_OACreate 'ADODB.Stream', #ObjectToken OUTPUT
EXEC sp_OASetProperty #ObjectToken, 'Type', 1
EXEC sp_OAMethod #ObjectToken, 'Open'
EXEC sp_OAMethod #ObjectToken, 'Write', NULL, #IMG_PATH
EXEC sp_OAMethod #ObjectToken, 'SaveToFile', NULL, #TIMESTAMP, 2
EXEC sp_OAMethod #ObjectToken, 'Close'
EXEC sp_OADestroy #ObjectToken
OK I created this:
using System;
using System.Collections.Generic;
using System.Data.SqlTypes;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;
namespace SaveBlobData
{
class SaveHTML
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void SaveBlob(out SqlInt32 value, int idZak)
{
value = 3 + idZak;
}
}
}
I add .dll but I get error when I select this. Where is problem?
Take This #HTML and save to file example.txt
For this part you can use OLE Automation Object
DECLARE #FSO int,
#oFile int,
#filename nvarchar(max) = 'c:\Folder\example.txt'
-- Create OLE Automation Object
EXEC sp_OACreate 'Scripting.FileSystemObject', #FSO OUT
-- Create file
EXEC sp_OAMethod #FSO, 'CreateTextFile', #oFile OUT, #filename, 8 , True
-- Write data
EXEC sp_OAMethod #oFile, 'Write', NULL, #HTML
-- Clear used objects
EXEC sp_OADestroy #FSO
EXEC sp_OADestroy #oFile
example.txt save to .zip with Password
Don't know how this could be done with t-sql, for that purpose we use powershell (or cmd):
# path to 7-zip
$zip = "C:\Program Files\7-Zip\7z.exe"
# file
$FilesArh = "c:\Folder\example.zip"
$Dir = "c:\Folder\example.txt"
&$zip a "$FilesArh" "$Dir"
Create file Test1.ps1 with this inside:
param
(
[String] $FilesArh,
[String] $Dir
)
# path to 7-zip
$zip = "C:\Program Files\7-Zip\7z.exe"
&$zip a "$FilesArh" "$Dir"
Launch it from SQL Server:
EXEC xp_cmdshell 'powershell C:\Folder\Test.ps1 "c:\Folder\example.zip" "c:\Folder\example.txt"'
.zip file convert to blob and put to table:
With OPENROWSET you can get BLOB data and INSERT it into table.
INSERT INTO your_table (BLOB_field)
SELECT *
FROM OPENROWSET(BULK 'c:\Folder\example.zip', SINGLE_BLOB) AS BLOB
You can achive this by using CLR Stored Procedure that allows you to access resources being out of SQL Server control. You can write this procedure in .NET (you can do anything you want in this procedure as for example read file, compress it, etc). Then you have to prepare a DLL assembly and connect it with SQL Server. Here you are an example from MSDN how to create a procedure from external assembly:
CREATE ASSEMBLY MyFirstUdp FROM 'C:\Programming\MyFirstUdp.dll';
CREATE PROCEDURE HelloWorld
AS EXTERNAL NAME MyFirstUdp.StoredProcedures.HelloWorld;
EXEC HelloWorld;
More information about CLR Stored Procedures (and presented example) you can find on https://msdn.microsoft.com/pl-pl/library/ms131094(v=sql.110).aspx
Until you have your CLR proceure available in SQL Server then you can call it just from the batch.
Related
I have a database on AWS RSD, I have a basic account of AWS. I found that I have to store the XML file on internet, then I have to read it from the URL.
So, I store the XML file into a Github repository and then I execute the query below. On my local server I have to execute a RECONFIG to activate some permissions.
It worked well on my local server, but in my database in AWS it didn't work. It prints a error of permissions of sp_OACreate, sp_OAMethod, sp_OAGetProperty, sp_OADestroy. Also I don't have permissions to execute sp_configure and RECONFIGURE.
I tried to change setting in the server page but I didn't found anything.
DECLARE
#url VARCHAR(1000),
#url2 VARCHAR(300),
#win INT,
#hr INT,
#Text VARCHAR(4000),
#xml XML
SET #url = 'https://raw.githubusercontent.com/KevinFallas03/FacturacionMunicipal_BD/master/Base%20de%20Datos/XML/Administradores.xml'--current file
SET #url2 = 'http://www.bnr.ro/nbrfxrates.xml'--test file
EXEC #hr = sp_OACreate 'WinHttp.WinHttpRequest.5.1', #win OUT
IF #hr <> 0 EXEC sp_OAGetErrorInfo #win
EXEC #hr = sp_OAMethod #win, 'Open', NULL, 'GET', #url, 'false'
IF #hr <> 0 EXEC sp_OAGetErrorInfo #win
EXEC #hr = sp_OAMethod #win, 'Send'
IF #hr <> 0 EXEC sp_OAGetErrorInfo #win
EXEC #hr = sp_OAGetProperty #win, 'ResponseText', #Text OUT
IF #hr <> 0 EXEC sp_OAGetErrorInfo #win
EXEC #hr = sp_OADestroy #win
IF #hr <> 0 EXEC sp_OAGetErrorInfo #win
SELECT #Text
SET #xml=CAST(#Text AS XML)
SELECT #xml
Query to activate permissions, it works on local database:
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
My intention is read a XML file from my database in AWS. So, if there is another way to do it, please tell me.
RDS offers many different types of database. It looks like you are using Microsoft SQL Server.
RDS is a managed database service. That means that you do not have full admin permissions on the database. You seem to be hoping to use OLE Automation, which requires the use of certain Stored Procedures like sp_OACreate.
OLE Automation is not supported in RDS Microsoft SQL Server. One alternative is to install and manage your own MS SQL Server running on EC2.
One option to solve the problem is to create a bucket on Amazon Storage S3, then upload the XML file on the bucket. Next you have to integrate AWS S3 buckets with AWS RDS SQL Server.
For complete guide to integrate AWS S3 buckets with AWS RDS SQL Server consulte here: https://www.sqlshack.com/integrating-aws-s3-buckets-with-aws-rds-sql-server/
With all set you can download the XML file with:
EXEC msdb.dbo.rds_download_from_s3
#s3_arn_of_file = 'arn:aws:s3:::<bucket-name>/<xml-name>.xml', --string with the ARN
#rds_file_path = 'D:\S3\<storage-name>\<xml-name>.xml', --where xml is saved
#overwrite_file = 1;
To check the status of the previuos task:
EXEC msdb..rds_task_status #task_id = <task_number>;
To parse the XML file:
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE()
FROM OPENROWSET(BULK 'D:\S3\<storage-name>\<xml-name>.xml', SINGLE_BLOB) AS x;
I have installed SQL Server Express on my machine and enabled and configured FILESTREAM to store and retrieve pdf's from SQL Server. I have successfully uploaded files to my table as BLOB's, but I am having difficulty retrieving them. My approach is to use a temporary directory to create the files in so I can open them. I have the following code:
I have configured ole automation
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ole Automation Procedures', 1;
GO
RECONFIGURE;
GO
I have the following record in my table BusinessFiles:
FileID 415578C7-B058-49A5-A1E4-5A4E7218EA19
InvoiceID 99999
FileName file1
FileType pdf
ImageFile 0x255044462D312…
This next piece of code apparently will create the file from the filestream.
DECLARE
#FILE VARBINARY(MAX)
,#FILEPATH VARCHAR(MAX)
,#ObjectToken INT
,#FileType VARCHAR(MAX)
,#FILENAME VARCHAR(MAX)
Set #FILENAME = (SELECT [FileName] FROM BusinessFiles where FileID = '415578C7-B058-49A5-A1E4-5A4E7218EA19')
Set #FileType = (SELECT FileType FROM BusinessFiles where FileID = '415578C7-B058-49A5-A1E4-5A4E7218EA19')
SELECT #FILE = ImageFile FROM BusinessFiles where FileID = '415578C7-B058-49A5-A1E4-5A4E7218EA19'
Set #FILEPATH = CONCAT('C:\Users\user\Desktop\', #FILENAME,'.',#FileType)
EXEC sp_OACREATE 'ADODB.Stream', #ObjectToken OUTPUT
EXEC sp_OASetProperty #ObjectToken, 'Type', 1
EXEC sp_OAMethod #ObjectToken, 'Open'
EXEC sp_OAMethod #ObjectToken, 'Write', NULL, #FILE
EXEC sp_OAMethod #ObjectToken, 'SaveToFile', NULL, #FILEPATH, 2
EXEC sp_OAMethod #ObjectToken, 'Close'
EXEC sp_OADestroy #ObjectToken
Go
This code runs and I get the Commands Completed successfully message. However there is nothing in my folder C:\Users\user\Desktop. Is there something I'm missing? Thanks;
I've verified the file path is correct and all the set's are good.
Knowing the permissions of SQL Server will fix the SaveToFile Issue. In my case, I changed the SavetoFile Directory to C:\temp.
I'm not familiar with Microsoft SQL Server and the varbinary(max) data type but the database which I need to use stores images as that.
My question is what do I need to do to read that data back and convert it back to readable image type?
So far I have done was
SELECT CONVERT(VARCHAR(max), [IMAGE], 2)
FROM [demo].[dbo].[DOCIMAGES]
WHERE [TITLE] = 'test.jpg'
but what I have got it was almost the same just removed 0x from the beginning of that data when
SELECT CONVERT(VARCHAR(max), [IMAGE], 0)
FROM [demo].[dbo].[DOCIMAGES]
WHERE [TITLE] = 'test.jpg'
returns value as Lead.
Then I have tried to do stored procedure which will save it to a file like:
DECLARE #ImageData VARBINARY (max);
DECLARE #Path2OutFile NVARCHAR (2000);
DECLARE #Obj INT
SET NOCOUNT ON
SELECT #ImageData = (
SELECT CONVERT(VARBINARY(max), [IMAGE], 1)
FROM [demo].[dbo].[DOCIMAGES]
WHERE [TITLE] = 'test.jpg'
);
SET #Path2OutFile = CONCAT (
'C:\Users\MyPC\Downloads'
,'\'
,'test.jpg'
);
BEGIN TRY
EXEC sp_OACreate 'ADODB.Stream' ,#Obj OUTPUT;
EXEC sp_OASetProperty #Obj ,'Type',1;
EXEC sp_OAMethod #Obj,'Open';
EXEC sp_OAMethod #Obj,'Write', NULL, #ImageData;
EXEC sp_OAMethod #Obj,'SaveToFile', NULL, #Path2OutFile, 2;
EXEC sp_OAMethod #Obj,'Close';
EXEC sp_OADestroy #Obj;
END TRY
BEGIN CATCH
EXEC sp_OADestroy #Obj;
END CATCH
SET NOCOUNT OFF
but that fails with an error:
SQL Server blocked access to procedure 'sys.sp_OADestroy' of component
'Ole Automation Procedures' because this component is turned off as
part of the security configuration for this server. A system
administrator can enable the use of 'Ole Automation Procedures' by
using sp_configure.
Problem is that I'm not the admin of that server.
In that case can I dump content of the [IMAGE] to a file and then use Java or PHP to stream that content and save it as an image file?
I got a stored proc to retrieve XML data from web service It works as I expected. After test for a while, I want to use this stored proc as SCHEDULED JOB then I created new one with T-SQL 'EXEC sp_GetData;' and got failed results (error 9400).
I reproduced that my stored proc can work fine if I execute it via Query Editor Window (EXEC sp_GetData;) but can't work if retrieving data are more than 3 objects of following XML data via scheduled job.
Question :
How to increase SQL Server Agent to retrieve all data (about 3MB file size) then insert into specific table.
<ArrayOfEmployeeMobilesInfo xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://tempuri.org/">
<EmployeeMobilesInfo>
<EmployeeCode>00001</EmployeeCode>
<TitleEN>Mr.</TitleEN>
<EmpNameEN>John</EmpNameEN>
<EmpSurnameEN>Doe</EmpSurnameEN>
<PositionNameEN>Police</PositionNameEN>
<Title>Mr.</Title>
<EmpName>John</EmpName>
<EmpSurname>Doe</EmpSurname>
<PositionName>Police</PositionName>
<CenterCode>PP777</CenterCode>
<Location>PP</Location>
<Email>john#person.com</Email>
<DivisionCode>PPD77</DivisionCode>
<DivisionName>PPD77</DivisionName>
<DepartmentCode>PDD25</DepartmentCode>
<DepartmentName>PDD25</DepartmentName>
<PositionLevel>POC</PositionLevel>
<PositionWeight>H</PositionWeight>
<JoinDate>2013-10-01T00:00:00</JoinDate>
<Mobiles>
<Mobile>
<MobileNo>1500111232</MobileNo>
</Mobile>
</Mobiles>
<TerminateDate xsi:nil="true" />
</EmployeeMobilesInfo>
... x 2
</ArrayOfEmployeeMobilesInfo>
my stored proc.
SET NOCOUNT ON;
DECLARE #URL NVARCHAR(500);
DECLARE #obj INT;
IF OBJECT_ID('xml_employees', 'U') IS NOT NULL DROP TABLE xml_employees;
IF OBJECT_ID('Employees', 'U') IS NOT NULL DROP TABLE Employees;
CREATE TABLE xml_employees ( resp XML );
SET #URL = 'http://localhost/DataService/Employee.asmx/GetEmployees';
EXEC sp_OACreate 'MSXML2.ServerXMLHttp', #obj OUT
EXEC sp_OAMethod #obj, 'Open', NULL, 'GET', #URL , false
EXEC sp_OAMethod #obj, 'send'
INSERT xml_employees ( resp )
EXEC sp_OAGetProperty #obj, 'responseXML.xml'
Error message
XML parsing: line 12, character 18, unexpected end of input [SQLSTATE 42000] (Error 9400). The step failed.
Please give me some advice.
Thank you
EDIT 1: Try to set TEXTSIZE as this thread mention
SET TEXTSIZE 2147483647; save my ass !
Default TEXTSIZE of SQL Server Agent is 4KB, BUT my instance got 1KB.
I use SQL Server and enable FileStream on my database. In order to save my file to filestream table I use below code from SSMS :
INSERT INTO dbo.mytable( Data )
SELECT *
FROM OPENROWSET(BULK 'C:\Temp\image.png', SINGLE_BLOB) AS z
I look for a SQL query to save FileStream data from table to special path.
How can do this.
I look for SQL Server query and I don't want use tools application or programming in .Net, Delphi and etc.
thanks in advance
How about this? It's a pure SQL approach to writing a file to disk, but it does you the command shell, which opens up a security risk on the server.
declare #writetofile varchar(max)
select #writetofile = 'osql -U -P -S -Q"select ColumnName from yourtable" -o"c:\SomeFolder\MyFile.bin"
exec master..xp_cmdshell #writetofile
Update:
This is not the easiest thing to get running, but try running this in a powerscript or .bat file:
Rem CD command sets the execution folder
cd C:\Program Files\Microsoft SQL Server\90\Tools\binn
rem SQLCmd sets the command using SQLCmd.exe program
rem -S = server name, -d database name, -U is username, -P is password, -Q is query to run, -o is output to
SQLCMD -S ServerName\InstanceName -d DBName -U sa -P MyPassword -Q"select top 1 FieldName from TableName" -o"c:\temp\MyFile.txt"
This post may help you:
Script to save varbinary data to disk
DECLARE #SQLIMG VARCHAR(MAX),
#IMG_PATH VARBINARY(MAX),
#TIMESTAMP VARCHAR(MAX),
#ObjectToken INT
DECLARE IMGPATH CURSOR FAST_FORWARD FOR
SELECT csl_CompanyLogo from mlm_CSCompanySettingsLocalizations
OPEN IMGPATH
FETCH NEXT FROM IMGPATH INTO #IMG_PATH
WHILE ##FETCH_STATUS = 0
BEGIN
SET #TIMESTAMP = 'd:\' + replace(replace(replace(replace(convert(varchar,getdate(),121),'-',''),':',''),'.',''),' ','') + '.bmp'
PRINT #TIMESTAMP
PRINT #SQLIMG
EXEC sp_OACreate 'ADODB.Stream', #ObjectToken OUTPUT
EXEC sp_OASetProperty #ObjectToken, 'Type', 1
EXEC sp_OAMethod #ObjectToken, 'Open'
EXEC sp_OAMethod #ObjectToken, 'Write', NULL, #IMG_PATH
EXEC sp_OAMethod #ObjectToken, 'SaveToFile', NULL, #TIMESTAMP, 2
EXEC sp_OAMethod #ObjectToken, 'Close'
EXEC sp_OADestroy #ObjectToken
FETCH NEXT FROM IMGPATH INTO #IMG_PATH
END
CLOSE IMGPATH
DEALLOCATE IMGPATH