Monthly Archives: May 2013

Run Multiple SqlCommand dengan sqlcmd dan .bat file untuk sqlserver 2005

suatu saat saya butuh melakukan query ke dalam database namun ingin melakukannya secara berbarengan, pikiran pertama yang muncul saat itu adalah menggunakan multithread di JAVA (http://docs.oracle.com/javase/tutorial/essential/concurrency/) , atau pararell processing di PHP (http://stackoverflow.com/questions/70855/how-can-one-use-multi-threading-in-php-applications) ,

namun keadaan server yang saat itu terinstall hanya sqlserver2005 dan windows server 2008, belum terinstall JRE JDK maupun PHP. mau tidak mau harus menggunakan full power of windows ๐Ÿ˜€

sebenarnya untuk melakukan hal ini tidaklah terlalu sulit, kebetulan code logic yang saya gunakan ada di stored procedure sqlserver, sehingga saya hanya membutuhkan program sederhana yang bertugas untuk melakukan pemanggilan pada stored procedure tersebut.

sqlserver2005 mempunyai interface berbasis command line layar hitam (SQLCMD) yang dapat membantu pemanggilan stored procedure nya, lalu untuk membuat pararell execution dari perintah query via sqlcmd saya menggunakan script .bat sederhana..

untuk mensimulasikannya anggap saja kita punya db env sqlserver 2005 seperti dalam script :

USE [testing_load_akeh]
GO
/****** Object:  Table [dbo].[logs]    Script Date: 05/26/2013 21:02:03 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[logs](
	[WAKTU] [datetime] NOT NULL,
	[CHANNEL] [int] NOT NULL,
	[MESSAGE] [varchar](100) NOT NULL
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object:  StoredProcedure [dbo].[usp_do_str_proc]    Script Date: 05/26/2013 21:02:02 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[usp_do_str_proc]
	@channel int,@message varchar(50)
AS
BEGIN
	declare @iterator int
	set @iterator = 1

	declare @messg varchar(100)

	while @iterator < 100
	begin
		set @messg =  @message + ' sekarang iterator ke '+cast(@iterator as varchar(5))

		insert into logs(waktu,channel,[message]) values (getdate(),@channel,@messg)

		set @iterator = @iterator + 1
	end
END
GO

dari script sql di atas dapat dilihat ada database bernama testing_load_akeh lalu kita juga memiliki table yang bernama logs dan stored procedure yang bernamaย  usp_do_str_proc

lalu untuk .bat nya terdiri dari 2 file yaitu (1) loop.bat yang bertugas membuat execution prosess sebanyak yang dibutuhkan, dan (2) run.bat yang akan melakukan pemanggilan perintah sqlcmd yang akan memanggil stored procedure usp_do_str_proc berikut file2 tersebut :

run.bat :

call sqlcmd -d testing_load_akeh -U <USERNAME> -P <PASSWORD> -Q "exec usp_do_str_proc @channel=%1,@message='%2'"

loop.bat

@echo off
for /L %%i in (1,1,3) do (
	set s=testingdaricmd
	start run.bat %%i %s%
)

dari script run.bat terlihat bahwa script tersebut akan memanggil stored procedure via sqlcmd
dan dari script loop.bat akan terlihat bahwa loop.bat akan melakukan pararell execution (new window) pada run.bat
dengan menggunakan perintah start dan parameter %%i dan %s%

untuk mengetest script kita, cukup ketik loop.bat di direktori ybs ๐Ÿ˜€

ok link menarik untuk mengetahui lebih detail sqlcmd anda dapat mengaksesnya dengan mengetikkan perintah sqlcmd /?
๐Ÿ˜€

happy coding