February 24, 2015 at 6:03 pm
My task is to convert jpeg's to binary and then insert them into a table called "images". I need to convert/insert all jpeg files in a directory. I'm able to accomplish the task if the files are numbered. The query below works by retrieving one file at a time based on the value of @i. However, I also have directories where the files are not numbered but have ordinary text names like "Red_Sofa.jpg". I need to iterate through these directories as well and convert/insert the jpeg's. I'm running SSMS 2014 Express on 4.0 and Windows 7. I appreciate the help.
DROP TABLE images
CREATE TABLE images
(
image_name varchar(500) null
,image_data varbinary(max) null
)
DECLARE @i int
SET @i = 951
WHILE (@i <= 951)
BEGIN
DECLARE @sql varchar(MAX)
SELECT @sql =
'INSERT INTO images (image_name, image_data)
SELECT
' + convert(nvarchar(5), @i) + ' AS image_name,
BulkColumn FROM OpenRowSet ( Bulk ''C:\DB\' +
convert(nvarchar(5), @i) +
'.jpg'', Single_Blob) AS image_data'
EXEC (@SQL)
SET @i = @i + 1
END
GO
February 27, 2015 at 4:46 am
Google the (undocumented :ermm:) extended stored procedure xp_dirtree - Patrick Keisler has a useful blog post.
March 20, 2015 at 9:54 pm
Here is a PowerShell example:
#env settings
$srv = "orlando-surface\sql2012"
$db = "tempdb"
$dir = "C:\@\"
#########################################################################
#nothing below here changes
#build connection string
$connStr = "Server=$srv;Database=$db;Trusted_Connection=True;"
#connect to the database
$conn = New-Object System.Data.SqlClient.SqlConnection($connStr)
$conn.Open()
#get list of files from directory
foreach($file in (Get-ChildItem $dir | where {-not $_.PSIsContainer}))
{
$filename = $file.FullName
$name = $file.Name
$binData = [System.IO.File]::ReadAllBytes($filename)
#prepare
$cmd = New-Object System.Data.SqlClient.SqlCommand("Insert into images (image_name, image_data) values(@image_name, @image_data)", $conn)
$cmd.CommandType = [System.Data.CommandType]'Text'
$cmd.Parameters.Add("@image_name", [System.Data.SqlDbType]'VarChar')
$cmd.Parameters["@image_name"].Value = $name
$cmd.Parameters.Add("@image_data", [System.Data.SqlDbType]'VarBinary')
$cmd.Parameters["@image_data"].Value = $binData
#execute
$cmd.ExecuteNonQuery()
}
$conn.Close()
$conn.Dispose()
There are no special teachers of virtue, because virtue is taught by the whole community.
--Plato
Viewing 3 posts - 1 through 2 (of 2 total)
You must be logged in to reply to this topic. Login to reply