Showing posts with label varchar. Show all posts
Showing posts with label varchar. Show all posts

Monday, March 26, 2012

Polish characters displayed incorrect after post

Greetings,

I have a SQL server 2000 running on an english win2000 workstation. In a
database I have a table where one varchar column is set to polish
collation.
Regional settings for the system is polish.
Data entered in a client application looks fine until they are posted.
When reading the data with the client application, the special polish
characters are incorrect, they appears as e.g. '1' and '3'.
The strange thing is that when I use query analyzer to look at the data,
then the polish characters appears as they should!
My client app use ADO, the SQLOLEDB provider. I have tried to use
'Locale Identifier=xxxx' in the connection string, without any luck.
If I change the column to be nvarchar instead of varchar, then it work,
but unfortunately, this solution is not an option. This should work on
varchar columns, since polish is not multibyte.

What am I doing wrong??

TIA
Best regards
Philip KofoedPhilip Kofoed (kofoed@.tiscali.dk) writes:
> I have a SQL server 2000 running on an english win2000 workstation. In a
> database I have a table where one varchar column is set to polish
> collation.
> Regional settings for the system is polish.
> Data entered in a client application looks fine until they are posted.
> When reading the data with the client application, the special polish
> characters are incorrect, they appears as e.g. '1' and '3'.
> The strange thing is that when I use query analyzer to look at the data,
> then the polish characters appears as they should!
> My client app use ADO, the SQLOLEDB provider. I have tried to use
> 'Locale Identifier=xxxx' in the connection string, without any luck.
> If I change the column to be nvarchar instead of varchar, then it work,
> but unfortunately, this solution is not an option. This should work on
> varchar columns, since polish is not multibyte.

You say that the regional settings of the system are Polish, but which
system are you talking about?

What are the regional settings of the machine where the client application
runs? If that machine has for instance Danish settings, the Polish
characters will indeed be converted.

Could you give more examples on how the various Polish characters are
displayed as? How is a-ogonek displayed, c-acute, etc?

--
Erland Sommarskog, SQL Server MVP, sommar@.algonet.se

Books Online for SQL Server SP3 at
http://www.microsoft.com/sql/techin.../2000/books.asp|||Erland Sommarskog wrote:

> You say that the regional settings of the system are Polish, but which
> system are you talking about?

The PC where _both_ the sql server and the client app runs, client app is
running on the same PC as the sql server. Windows is english, but with polish
regional settings. Collation of the varchar column where I'm saving the polish
string is polish.

> Could you give more examples on how the various Polish characters are
> displayed as? How is a-ogonek displayed, c-acute, etc?

I have placed some screenshots here:
http://www.provosoft.com/sql/sql.html

Data are stored correct, since query analyzer reads and displays data correct.
So the problem must be somewhere else.

Best regards
Philip Kofoed|||Philip Kofoed (kofoed@.tiscali.dk) writes:
> The PC where _both_ the sql server and the client app runs, client app
> is running on the same PC as the sql server. Windows is english, but
> with polish regional settings. Collation of the varchar column where I'm
> saving the polish string is polish.

But is Polish the default locale for the server? Or is it just the
setting for the user you are logged in as?

And what value do you have in
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\Nls\CodePage\ACP?
Does it say 1252 or 1250?

Looking at the examples, it seems clear that when the data is received
from SQL Server is taken to be Latin-1 data, and then there is a
conversion to CP1250, using fallback characters. For instance L-slash
is 163, which is the pound sign in Latin-1, whence the L. l-slash is
179 in Latin-2, while in Latin-1 this code point is 3-superscript, so
3 is used as the fallback.

--
Erland Sommarskog, SQL Server MVP, sommar@.algonet.se

Books Online for SQL Server SP3 at
http://www.microsoft.com/sql/techin.../2000/books.asp|||> But is Polish the default locale for the server? Or is it just the
> setting for the user you are logged in as?

Default locale is Polish. 'Language settings for the system' set to Central
Europe (default), 'Settings for current user' set to Polish locale.

> And what value do you have in
> HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\Nls\CodePage\ACP?
> Does it say 1252 or 1250?

1250, i.e eastern europe.

I just tried running my client app on a polish win XP. Client app then
connects to sql server running on english win 2000, default locale polish.
Characters are _still_ corrupted??
Query Analyzer still displays characters correct.

I'm going to leave this problem, and send it back the support staff. Thank you
for your time and effort, Erland!

Best regards
Philip Kofoed|||Philip Kofoed (kofoed@.tiscali.dk) writes:
>> But is Polish the default locale for the server? Or is it just the
>> setting for the user you are logged in as?
> Default locale is Polish. 'Language settings for the system' set to
> Central Europe (default), 'Settings for current user' set to Polish
> locale.

The last straw:

SELECT serverproperty('Collation'),
databasepropertyex('yourdb', 'Collation')

And exactly how do the queries submitted by the application look like?

I refuse to believe that the language of Windows should matter.

--
Erland Sommarskog, SQL Server MVP, sommar@.algonet.se

Books Online for SQL Server SP3 at
http://www.microsoft.com/sql/techin.../2000/books.asp|||Hi Erland,

> I refuse to believe that the language of Windows should matter.

I have found out that if I create a new database with polish collation
then it works on english windows then regional settings is polish.
If collation of the DB isn't polish, but a column has polish collation,
then characters read from that column is incorrect.

Our installation crew that installed the original server in Poland,
installed it with Latin collation, realized their mistake, and used DTS to
copy the DB to a new DB with polish collation, and characters in the new
DB was dispalyed incorrect. I haven't tested this last scenario, because
our problem is solved when using polish collation when creating the DB.

Thanks again for all your help! :)

Best regards
Philip Kofoed|||Philip Kofoed (kofoed@.tiscali.dk) writes:
> I have found out that if I create a new database with polish collation
> then it works on english windows then regional settings is polish.
> If collation of the DB isn't polish, but a column has polish collation,
> then characters read from that column is incorrect.

Don't really see why this is happening if you are getting data directly
from the table. But if you for some reason first get data into local
variables, it's obvious, as local variables always have the collation
of the database.

Anyway, you got it working and that's the main thing.

--
Erland Sommarskog, SQL Server MVP, sommar@.algonet.se

Books Online for SQL Server SP3 at
http://www.microsoft.com/sql/techin.../2000/books.asp

Friday, March 23, 2012

Point-In-Time Restoration Problem

I'm learning how to restore a database to a point-in-time. I set up a
database called DR_TEST and a table called tblTest with a single
varchar column. I back up the database using the following command:
use master
go
BACKUP DATABASE DR_TEST
TO DISK = 'c:\backup\dr_test\dr.bak'
go
Then I run a TSQL script to continuously insert records into the
tblTest table. Using Enterprise Manager I have a scheduled transaction
log backup running every three minutes to c:\backup\dr_test\drLog.bak.
I drop the tblTest table and backup the transaction log using the
following command:
BACKUP LOG DR_TEST
TO DISK = 'c:\backup\dr_test\drLog.bak'
I then run the following commands to restore the database to it's state
at 2:25 PM:
use master
go
RESTORE DATABASE DR_TEST
FROM DISK = 'C:\BACKUP\DR_TEST\dr.bak'
WITH NORECOVERY
go
RESTORE LOG DR_TEST
FROM DISK = 'C:\BACKUP\DR_TEST\drLog.bak'
WITH RECOVERY,
STOPAT = N'11/16/2006 2:25 PM'
go
When I run the log restore I get the following message:
This log file contains records logged before the designated
point-in-time. The database is being left in load state so you can
apply another log file.
I started inserting the data at 2:22 PM and I dropped the table at 2:27
PM. Why would I get this message?
--
JerrySeems you did several log backups but only restored the very first one...
--
Tibor Karaszi, SQL Server MVP
http://www.karaszi.com/sqlserver/default.asp
http://www.solidqualitylearning.com/
"Jerry" <jerryalan@.gmail.com> wrote in message
news:1163710146.977620.47300@.e3g2000cwe.googlegroups.com...
> I'm learning how to restore a database to a point-in-time. I set up a
> database called DR_TEST and a table called tblTest with a single
> varchar column. I back up the database using the following command:
> use master
> go
> BACKUP DATABASE DR_TEST
> TO DISK = 'c:\backup\dr_test\dr.bak'
> go
> Then I run a TSQL script to continuously insert records into the
> tblTest table. Using Enterprise Manager I have a scheduled transaction
> log backup running every three minutes to c:\backup\dr_test\drLog.bak.
> I drop the tblTest table and backup the transaction log using the
> following command:
> BACKUP LOG DR_TEST
> TO DISK = 'c:\backup\dr_test\drLog.bak'
> I then run the following commands to restore the database to it's state
> at 2:25 PM:
> use master
> go
> RESTORE DATABASE DR_TEST
> FROM DISK = 'C:\BACKUP\DR_TEST\dr.bak'
> WITH NORECOVERY
> go
> RESTORE LOG DR_TEST
> FROM DISK = 'C:\BACKUP\DR_TEST\drLog.bak'
> WITH RECOVERY,
> STOPAT = N'11/16/2006 2:25 PM'
> go
> When I run the log restore I get the following message:
> This log file contains records logged before the designated
> point-in-time. The database is being left in load state so you can
> apply another log file.
> I started inserting the data at 2:22 PM and I dropped the table at 2:27
> PM. Why would I get this message?
>
> --
> Jerry
>

Tuesday, March 20, 2012

Plz do evaluate this SP

ALTER PROCEDURE JobsonUser_GetuserListValues (
@.p_PortalID int ,
@.p_UserID int,
@.p_SubscriptionText varchar(255))
AS
BEGIN

SET NOCOUNT ON

Variable Declarations

Declare @.userID int
Declare @.portalID int
Declare @.DynamicQuestionID varchar(255)
Declare @.Question varchar(255)
Declare @.i int
Declare @.count int
Declare @.loop int

Declare @.SubscriptionList Table (PortalID int , Question Varchar(255) , DynamicQuestionID varchar(255))
Declare @.ResponseList Table (DynamicQuestionID varchar(255) , Response varchar(255) , SortOrder int , Pos int IDENTITY (0,1))
Declare @.ResultSet Table (Rid int IDENTITY (0,1),ResultValue smallint)

- Variable Declarations Ends

-- Initializations

Set @.i = 0
Set @.count = 1
Set @.loop = 0

-- Getting User Level Info And Portal ID

-- Step 1

Select
@.userID = a.UserID ,
@.portalID = b.PortalID
From Users a
Left Outer Join UserPortals b
On a.UserId = b.UserID
Where a.UserID = @.p_UserID And b.PortalID = @.p_PortalID

--

- Step 2

Insert into @.SubscriptionList (PortalID,Question , DynamicQuestionID)
Select PortalID,Question,DynamicQuestionID
From DynamicRegistration_Question
Where ShortFieldName = @.p_SubscriptionText

Select Top 1
@.DynamicQuestionID = DynamicQuestionID ,
@.Question = Question
From @.SubscriptionList

--Select @.DynamicQuestionID

select @.Question

Step 3

Insert into @.ResponseList (DynamicQuestionID , Response , SortOrder)
select
a.DynamicQuestionID , b.Response , a.SortOrder
From DynamicRegistration_QuestionOption a
left outer join DynamicRegistration_QuestionResponse b
on a. DynamicQuestionID = b.DynamicQuestionID
And a.QuestionOption = b.Response
Where a.DynamicQuestionID = @.DynamicQuestionID --'B440AC87-FC53-4735-A6D8-EB4DBFD9D447'
And b.UserID = @.userID And a.Inactive = 0
order by a.SortOrder

Select @.count = count(*) From @.ResponseList

IF (@.count > 0 )
Begin
While (@.loop < 3)
Begin
if Exists(Select * from @.ResponseList Where Pos = @.loop)
Begin
Insert into @.ResultSet (ResultValue) values(1)
End
else
Begin
Insert into @.ResultSet (ResultValue) values(0)
End
Set @.count = @.count + 1
Set @.loop = @.loop + 1
End
End
Else
begin
Insert into @.ResultSet (ResultValue) values(0)
Insert into @.ResultSet (ResultValue) values(0)
Insert into @.ResultSet (ResultValue) values(0)
end

Select
case ResultValue When 0 Then 'False'
Else 'True' End as ResultValue
from @.ResultSet
return

ENDMoving to Transact-SQL forum.|||

Arivindt:

First, I give you a lot of credit because you asked to have your code reviewed. This is always worthwhile and I want to encourage you to continue this habbit -- it will serve you well.

The first question that I have involves this line:

Code Snippet

Where a.DynamicQuestionID = @.DynamicQuestionID --'B440AC87-FC53-4735-A6D8-EB4DBFD9D447'

There are some definite performance problems associated with uniqueidentifiers; Is it necessary to use a uniqueidentifier here? Can the table be modified to use a smaller datatype? ( I will assume that this would require too much work ) For future work, avoid UNIQUEIDENTIFIER datatypes as they have a negative impact on performance.

This section of code also bothers me a little:

Code Snippet

Insert into @.SubscriptionList (PortalID,Question , DynamicQuestionID)
Select PortalID,Question,DynamicQuestionID
From DynamicRegistration_Question
Where ShortFieldName = @.p_SubscriptionText

Select Top 1
@.DynamicQuestionID = DynamicQuestionID ,
@.Question = Question
From @.SubscriptionList

The first thing that I noticed was that this was followed by what appears to be a couple of DEBUG statements. Therefore, I presume that this either is giving you some trouble or has given you trouble in the past. It bothers me to see the "TOP 1" clause without an "ORDER BY" clause.

Also, Since the @.SubscriptionList table is not used after this section, I believe that the code can be simplified and perhaps the @.SubscriptionList table variable can be completely eliminated. Something like this might work here:

Code Snippet

select @.DynamicQuestionId = DynamicQuestionId,
@.Question = Question
from ( select top 1
DynamicQuestionId,
Question
from DynamicRegistration_Question
Where ShortFieldName = @.p_SubscriptionText
-- I feel like an order by should be added here.
) x

Note the location to add an ORDER BY clause. I would recommend that you figure out what the ordering should be and add an ORDER BY clause.

I also think that step #3 can be simplified.

|||

Hi,

Thank u so much for evaluating and giving me proper guidence.....

I will do my level best to incorporate the changes and suggestion what i hav e gained from ur

reply.

Once again thanks a lot

Thanks & Regards

Aravind

|||

Aravind:

I think that for step #3 that you might be able to simplify this:

Code Snippet

Insert into @.ResponseList (DynamicQuestionID , Response , SortOrder)
select
a.DynamicQuestionID , b.Response , a.SortOrder
From DynamicRegistration_QuestionOption a
left outer join DynamicRegistration_QuestionResponse b
on a. DynamicQuestionID = b.DynamicQuestionID
And a.QuestionOption = b.Response
Where a.DynamicQuestionID = @.DynamicQuestionID --'B440AC87-FC53-4735-A6D8-EB4DBFD9D447'
And b.UserID = @.userID And a.Inactive = 0
order by a.SortOrder

Select @.count = count(*) From @.ResponseList

IF (@.count > 0 )
Begin
While (@.loop < 3)
Begin
if Exists(Select * from @.ResponseList Where Pos = @.loop)
Begin
Insert into @.ResultSet (ResultValue) values(1)
End
else
Begin
Insert into @.ResultSet (ResultValue) values(0)
End
Set @.count = @.count + 1
Set @.loop = @.loop + 1
End
End
Else
begin
Insert into @.ResultSet (ResultValue) values(0)
Insert into @.ResultSet (ResultValue) values(0)
Insert into @.ResultSet (ResultValue) values(0)
end

Select
case ResultValue When 0 Then 'False'
Else 'True' End as ResultValue
from @.ResultSet
return

END

to something like this:

Code Snippet

select case when y.Seq is not null then 'True' else 'False' end
as ResultValue
from ( select 1 as Seq union all select 2 union all select 3) x
left join ( select row_number() over
( order by a.SortOrder, a.DynamicQuestionId )
as Seq,
a.DynamicQuestionID,
b.Response,
a.SortOrder
From DynamicRegistration_QuestionOption a
left outer join DynamicRegistration_QuestionResponse b
on a. DynamicQuestionID = b.DynamicQuestionID
And a.QuestionOption = b.Response
Where a.DynamicQuestionID = @.DynamicQuestionID --'B440AC87-FC53-4735-A6D8-EB4DBFD9D447'
And b.UserID = @.userID And a.Inactive = 0
order by a.SortOrder
) y
on x.Seq = y.Seq
and y.Seq <= 3

The final thing that I cannot stress enough is to continue to ask for another set of eyes to look over your work! It is for that reason that I really would like for some of the other more senior members of this forum to also add their comments. I frequently miss something and sometimes just flat out get something wrong. My main motivation to joining this forum was to learn and YOUR question today has helped me to continue to learn. I hope you will continue to contribute.

Kent

|||

SELECT
dt.DynamicQuestionID, dt.QuestionOption,
dt.UserID, qo.SortOrder,
CASE
WHEN qr.Response IS NULL THEN 'FALSE'
ELSE 'TRUE'
END AS Status
FROM
(
SELECT
DISTINCT qr.DynamicQuestionID, qr.UserID, qo.QuestionOption FROM
DynamicRegistration_QuestionResponse qr
CROSS JOIN
DynamicRegistration_QuestionOption qo
) AS dt
INNER JOIN
DynamicRegistration_QuestionOption qo
ON
qo.DynamicQuestionID = dt.DynamicQuestionID
AND qo.QuestionOption = dt.QuestionOption
LEFT OUTER JOIN
DynamicRegistration_QuestionResponse qr
ON
dt.DynamicQuestionID = qr.DynamicQuestionID
AND dt.QuestionOption = qr.Response
AND dt.UserID = qr.UserID

Friday, March 9, 2012

Please validate my query

Hi,

I have written a query for the following scenario :

I have 2 tables:

RecType - RecID(int), RecType(varchar)

Eg: 1 Joined, 2 Transferred, 3 Rusticated

Student - StudentID(int), RecID, Age(smallint), Sex(nchar(1)), DateOfJoining(datetime)

The query is :

select

[RecType] AS RecType,

cnt as TotalCount

from

(

select

RC.RecType,

count(*)as cnt

from

RecType as RC

innerjoin

Studentas stu

on RC.recid= STU.recid

where

STU.DateOfJoining>=convert(varchar(6),dateadd(month,-6,getdate()), 112)+'01'AND

(recid= 1 OR recid = 2 OR recid = 3)

groupby

RC.RecType

)as t

So the final results are as following

RecType Total Count

Joined 55

Transferred 3

Rusticated 0

However, I want to write a query that displays a grouping of students who have either joined, Transferred or rusticated grouped by each month, during the past 6 months. Please not that the date of joining/transfer etc of each student can be different in a month.

So the final results will be as following

RecType Total Count Month

Joined 23 1

Transferred 3 1

Rusticated 0 1

Joined 32 2

and so on..

How do I do this?

Thanks.

It is not bad idea to include the year while fetching the data for month...

Code Snippet

Select

RecType

,[Month]

,[Year]

,Count(*) as TotalCount

From

(

select

RC.RecType

,Month(STU.DateOfJoining) [Month]

,Year(STU.DateOfJoining) [Year]

from

RecType as RC

inner join Student as stu

on RC.recid= STU.recid

where

STU.DateOfJoining >= convert(varchar(6), dateadd(month, -6, getdate()), 112) + '01'

AND(recid= 1 OR recid = 2 OR recid = 3)

) as Data

Group by

RecType

,[Month]

,[Year]

|||

Hi,

Thanks for the query. I understood where I was going wrong.

Manivannan, I know that writing good T-sql queries comes from practise. However, can you suggest me a good book to learn T-sql for sql 2005.

Also can you please visit this post :

http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1664669&SiteID=1

Thanks.

Wednesday, March 7, 2012

please solve this deadlock problem

i have 2 stored procedures
1st sp
CREATE procedure dbo.sfd_sp_Assign_PR
@.VOICE_FILE_LOCATION VARCHAR(255),
@.VOICE_FILE_NAME VARCHAR(255),
@.PR VARCHAR(10),
@.TYPE CHAR(1),
@.ACCOUNTID varchar(10) OUTPUT,
@.DICTATOR VARCHAR(50) OUTPUT
AS
DECLARE @.Count as int
DECLARE @.LAST_PR as VARCHAR(10)
DECLARE @.TR as VARCHAR(10)
DECLARE @.PROVIDER_ID as smallint
DECLARE @.DURATION as int
DECLARE @.SHIFT_ID as varchar(10)
DECLARE @.TR_SHIFT_ID as varchar(10)
DECLARE @.FILE_ASSIGNED_DATE as datetime
DECLARE @.TR_ASSIGNED_TIME as datetime
DECLARE @.undertranscription as int
DECLARE @.readyforproofreading as int
DECLARE @.MaxSequence as int
DECLARE @.WEIGHTED_PR_DURATION as int
DECLARE @.PR_VOICE_WEIGHT as int
DECLARE @.TR_STATUS AS CHAR(1)
DECLARE @.PR_DOC_FILE_NAME AS VARCHAR(255)
DECLARE @.PR_DOC_FILE_LOCATION AS VARCHAR(255)
DECLARE @.PATIENT_NAME AS VARCHAR(50)
DECLARE @.MRN AS VARCHAR(20)
DECLARE @.VISIT_DATE AS SMALLDATETIME
DECLARE @.TR_CHAR_COUNT AS INT
DECLARE @.VF_START_TIME AS SMALLINT
DECLARE @.VF_END_TIME AS SMALLINT
DECLARE @.TR_NOTES AS VARCHAR(1000)
DECLARE @.TR_CHECKIN_DATETIME AS DATETIME
DECLARE @.REPORT_TYPE AS VARCHAR(50)
DECLARE @.TR_PL_STATUS AS SMALLINT
DECLARE @.LOCATIONID AS SMALLINT
DECLARE @.TR_TRANSCRIPTS CURSOR
SELECT @.ACCOUNTID=ACCOUNTID,@.PROVIDER_ID=PROVID
ER_ID,@.DURATION=DURATION,
@.WEIGHTED_PR_DURATION=WEIGHTED_PR_DURATI
ON FROM VOICE_FILES with (nolock)
WHERE
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
IF @.ACCOUNTID is NULL
return -1 --No record in voice files
SELECT @.Count=COUNT(*) FROM ACCOUNT_WEIGHTS with (nolock) WHERE
ACCOUNTID=@.ACCOUNTID AND PROVIDER_ID=@.PROVIDER_ID
If @.Count = 0
return -2 --No record in account weights
SELECT @.Count=count(*) from DISTRIBUTION with (nolock) where
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
If @.Count = 0
return -3 --File not assigned to TR for transcription
SELECT @.Count=count(*) FROM VOICE_FILE_PRIORITY with (nolock) WHERE
VOICE_FILE_NAME=@.VOICE_FILE_NAME AND
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
If @.Count = 0
return -4 --No record in voice file priority
SELECT assigned_to_pr FROM DISTRIBUTION with (nolock) WHERE
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND VOICE_FILE_NAME=@.VOICE_FILE_NAME and ASSIGNED_TO_PR=@.PR
if @.@.rowcount=1
return -5 --file already assigned to selected PR
SELECT @.SHIFT_ID=SHIFT_ID FROM EMP_SHIFT with (nolock) WHERE EMPID=@.PR AND
getdate() >= EFFECTIVE_DATE AND DAY_OF_WEEK = DATEPART(dw,getdate())
If @.SHIFT_ID IS NULL
return -6 --Shift ID not found
SET @.undertranscription = 0
SET @.readyforproofreading = 0
SELECT @.MaxSequence=max(sequence) from distribution with (nolock) WHERE
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
SELECT @.LAST_PR=ASSIGNED_TO_PR FROM DISTRIBUTION with (nolock) WHERE
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND VOICE_FILE_NAME=@.VOICE_FILE_NAME and sequence=@.MaxSequence
IF @.MaxSequence=1 AND @.LAST_PR IS NULL
BEGIN
SELECT @.Count=COUNT(*) FROM VF_TR_ASSIGN with (nolock) WHERE STATUS in
('A','O') AND VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
IF @.Count > 0
SET @.undertranscription = @.Duration
SELECT @.Count=COUNT(*) FROM VF_TR_ASSIGN with (nolock) WHERE STATUS='C' AND
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
IF @.Count > 0
SET @.readyforproofreading = @.Duration
END
SELECT @.PR_VOICE_WEIGHT=PR_VOICE_WEIGHT FROM ACCOUNT_WEIGHTS_EXCP with
(nolock) WHERE ACCOUNTID=@.ACCOUNTID
AND PROVIDER_ID=@.PROVIDER_ID AND EMPID=@.PR
if @.PR_VOICE_WEIGHT IS NOT NULL
SET @.WEIGHTED_PR_DURATION = @.PR_VOICE_WEIGHT * @.DURATION
--SELECT @.DICTATOR=FIRST_NAME + ' ' + LAST_NAME FROM PROVIDER WHERE
PROVIDER_ID=@.PROVIDER_ID
SELECT @.DICTATOR=DICTATED_BY FROM PROVIDER WHERE PROVIDER_ID=@.PROVIDER_ID
SELECT @.FILE_ASSIGNED_DATE=dbo. sfd_fn_File_Assigned_Date(@.PR,getdate())
SET @.FILE_ASSIGNED_DATE=CONVERT(VARCHAR(12),
@.FILE_ASSIGNED_DATE,101)
BEGIN TRANSACTION
IF @.LAST_PR IS NULL AND @.MaxSequence=1
BEGIN
UPDATE TR_TRANSCRIPTS with (updlock) SET ASSIGNED_TO_PR=@.PR WHERE
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
If @.@.ERROR !=0
BEGIN
ROLLBACK TRANSACTION
RETURN 0
END
UPDATE DISTRIBUTION with (updlock) SET
ASSIGNED_TO_PR=@.PR,PR_SHIFT_ID=@.SHIFT_ID
,
PR_ASSIGNED_TIME=GETDATE(),DISTRIBUTION_
TYPE=@.TYPE WHERE
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND VOICE_FILE_NAME=@.VOICE_FILE_NAME AND SEQUENCE=1
If @.@.ERROR !=0
BEGIN
ROLLBACK TRANSACTION
RETURN 0
END
UPDATE VOICE_FILE_PRIORITY with (updlock) SET ASSIGNED_TO_PR=@.PR WHERE
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
If @.@.ERROR != 0
BEGIN
ROLLBACK TRANSACTION
RETURN 0
END
END
ELSE
BEGIN
SELECT @.TR_STATUS=TR_STATUS, @.TR=ASSIGNED_TO_TR, @.TR_SHIFT_ID=TR_SHIFT_ID,
@.TR_ASSIGNED_TIME=TR_ASSIGNED_TIME
FROM DISTRIBUTION with (nolock) WHERE sequence=1 AND
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
INSERT INTO DISTRIBUTION (VOICE_FILE_LOCATION, VOICE_FILE_NAME,
TR_STATUS,SEQUENCE,NOTES,PR_STATUS,ASSIG
NED_TO_TR,ASSIGNED_TO_PR,TR_SHIFT_ID
,PR_SHIFT_ID,TR_ASSIGNED_TIME,PR_ASSIGNE
D_TIME,DISTRIBUTION_TYPE) values
(@.VOICE_FILE_LOCATION, @.VOICE_FILE_NAME, @.TR_STATUS, @.MaxSequence+1,
'Distributed to Tr', 'N', @.TR, @.PR, @.TR_SHIFT_ID, @.SHIFT_ID,
@.TR_ASSIGNED_TIME, GETDATE(),@.TYPE)
-- SELECT @.COUNT=COUNT(*) FROM TR_TRANSCRIPTS WHERE PR_STATUS IN ('N','P')
AND VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
-- AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
-- IF @.COUNT = 0
-- BEGIN
-- SELECT @.COUNT=COUNT(*) FROM TR_TRANSCRIPTS WHERE
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
-- AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
-- IF @.COUNT > 0
-- BEGIN
UPDATE VOICE_FILE_PRIORITY with (updlock) SET ASSIGNED_TO_PR=@.PR WHERE
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND VOICE_FILE_NAME=@.VOICE_FILE_NAME AND ASSIGNED_TO_PR IS NULL
If @.@.ERROR != 0
BEGIN
ROLLBACK TRANSACTION
RETURN 0
END
-- END
-- END
SET @.TR_TRANSCRIPTS = CURSOR FOR
SELECT
PATIENT_NAME,MRN,VISIT_DATE,TR_CHAR_COUN
T,PR_DOC_FILE_NAME,PR_DOC_FILE_LOCAT
ION,VF_START_TIME,VF_END_TIME,TR_NOTES,R
EPORT_TYPE,TR_CHECKIN_DATETIME,TR_PL
_STATUS,ASSIGNED_TO_TR,LOCATIONID
FROM TR_TRANSCRIPTS with (nolock) where ASSIGNED_TO_PR=@.LAST_PR AND
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND VOICE_FILE_NAME=@.VOICE_FILE_NAME AND PR_DOC_FILE_NAME IS NOT NULL
OPEN @.TR_TRANSCRIPTS
FETCH NEXT FROM @.TR_TRANSCRIPTS INTO
@.PATIENT_NAME,@.MRN,@.VISIT_DATE,@.TR_CHAR_
COUNT,@.PR_DOC_FILE_NAME,@.PR_DOC_FILE
_LOCATION,@.VF_START_TIME,@.VF_END_TIME,@.T
R_NOTES,@.REPORT_TYPE,@.TR_CHECKIN_DAT
ETIME,@.TR_PL_STATUS,@.TR,@.LOCATIONID
WHILE (@.@.FETCH_STATUS = 0)
BEGIN
INSERT INTO
TR_TRANSCRIPTS(DOC_FILE_NAME,DOC_FILE_LO
CATION,PATIENT_NAME,MRN,VISIT_DATE,T
RANSCRIPTION_STATUS,TR_CHAR_COUNT,VOICE_
FILE_NAME,VOICE_FILE_LOCATION,ASSIGN
ED_TO_TR,TR_CHECKIN_DATETIME,PR_STATUS,V
F_START_TIME,VF_END_TIME,TR_NOTES,RE
PORT_TYPE,TR_PL_STATUS,ASSI
GNED_TO_PR,LOCATIONID) VALUES
(@.PR_DOC_FILE_NAME,@.PR_DOC_FILE_LOCATION
,@.PATIENT_NAME,@.MRN,@.VISIT_DATE,'A',
@.TR_CHAR_COUNT,@.VOICE_FILE_NAME,@.VOICE_F
ILE_LOCATION,@.TR,@.TR_CHECKIN_DATETIM
E,'N',@.VF_START_TIME,@.VF_END_TIME,@.TR_NO
TES,@.REPORT_TYPE,@.TR_PL_STATUS,@.PR,@.
LOCATIONID)
SET @.undertranscription = 0
SET @.readyforproofreading = @.Duration
FETCH NEXT FROM @.TR_TRANSCRIPTS INTO
@.PATIENT_NAME,@.MRN,@.VISIT_DATE,@.TR_CHAR_
COUNT,@.PR_DOC_FILE_NAME,@.PR_DOC_FILE
_LOCATION,@.VF_START_TIME,@.VF_END_TIME,@.T
R_NOTES,@.REPORT_TYPE,@.TR_CHECKIN_DAT
ETIME,@.TR_PL_STATUS,@.TR,@.LOCATIONID
END
CLOSE @.TR_TRANSCRIPTS
DEALLOCATE @.TR_TRANSCRIPTS
--UPDATE EMP_ASSIGNED_WORKLOAD
END
--common
UPDATE VOICE_FILES with (updlock) SET STATUS='A',TYPE= CASE WHEN TYPE='B'
OR TYPE='R' THEN 'N' ELSE TYPE END WHERE
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND
VOICE_FILE_NAME=@.VOICE_FILE_NAME
If @.@.ERROR !=0
BEGIN
ROLLBACK TRANSACTION
RETURN 0
END
IF EXISTS(SELECT empid from emp_assigned_workload with (nolock) WHERE
EMPID=@.PR AND FILE_ASSIGNED_DATE=@.FILE_ASSIGNED_DATE
AND SHIFT_ID=@.SHIFT_ID)
UPDATE EMP_ASSIGNED_WORKLOAD with (updlock) SET
UNDER_TRANSCRIPTION=UNDER_TRANSCRIPTION+
@.undertranscription,READY_FOR_PROOFR
EADING=READY_FOR_PROOFREADING+@.readyforp
roofreading,
WORK_ASSIGNED=WORK_ASSIGNED+@.WEIGHTED_PR
_DURATION,
PR_WORK_ASSIGNED=PR_WORK_ASSIGNED+@.DURAT
ION
WHERE EMPID=@.PR AND FILE_ASSIGNED_DATE=@.FILE_ASSIGNED_DATE AND
SHIFT_ID=@.SHIFT_ID
ELSE
INSERT INTO
EMP_ASSIGNED_WORKLOAD(FILE_ASSIGNED_DATE
,EMPID,PR_WORK_COMPLETED,TR_WORK_COM
PLETED,
UNDER_TRANSCRIPTION,READY_FOR_PROOFREADI
NG,PR_WORK_ASSIGNED,TR_WORK_ASSIGNED
,SHIFT_ID,
WORK_ASSIGNED) VALUES (@.FILE_ASSIGNED_DATE,@.PR,0,0,@.undertrans
cription,
@.readyforproofreading,@.DURATION,0,@.SHIFT
_ID,@.WEIGHTED_PR_DURATION)
If @.@.ERROR !=0 OR @.@.ROWCOUNT=0
BEGIN
ROLLBACK TRANSACTION
RETURN -10
END
COMMIT TRANSACTION
RETURN 1
GO
--end 1st sp
2nd sp
CREATE procedure dbo.sfd_sp_Assign_TR
@.VOICE_FILE_LOCATION VARCHAR(255),
@.VOICE_FILE_NAME VARCHAR(255),
@.TR VARCHAR(10),
@.ACCOUNTID varchar(10) output,
@.DICTATOR VARCHAR(50) output
AS
DECLARE @.Count as int
DECLARE @.PROVIDER_ID as smallint
DECLARE @.WEIGHTED_TR_DURATION as int
DECLARE @.DURATION as int
DECLARE @.SHIFT_ID as varchar(10)
DECLARE @.STAT_FLAG as char(1)
DECLARE @.MAX_Priority as int
DECLARE @.PRIORITY as bit
DECLARE @.FILE_ASSIGNED_DATE as datetime
DECLARE @.TRANS_VOICE_WEIGHT AS int
DECLARE @.MASTER_BLOCKED AS int
SELECT @.ACCOUNTID=ACCOUNTID,@.PROVIDER_ID=PROVID
ER_ID,@.DURATION=DURATION,
@.WEIGHTED_TR_DURATION=WEIGHTED_TR_DURATI
ON,@.STAT_FLAG=STAT_FLAG FROM
VOICE_FILES with (nolock) WHERE
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
IF @.ACCOUNTID is NULL
return -1 --No record in voice files
SELECT @.Count=COUNT(*) FROM ACCOUNT_WEIGHTS WHERE ACCOUNTID=@.ACCOUNTID AND
PROVIDER_ID=@.PROVIDER_ID
If @.Count = 0
return -2 --No record in account weights
SELECT @.Count=count(*) from vf_tr_assign where
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
If @.Count > 0
return -3 --TR has already started working on the file
SELECT @.SHIFT_ID=SHIFT_ID FROM EMP_SHIFT with (nolock) WHERE EMPID=@.TR AND
getdate() >= EFFECTIVE_DATE AND DAY_OF_WEEK = datepart(dw,getdate())
If @.SHIFT_ID is null
return -4 --Shift ID not found
SELECT @.Count=count(*) from DISTRIBUTION where
VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
If @.Count > 0
return -5 --File already assigned for transcription
if @.STAT_FLAG='S' or @.STAT_FLAG='P'
SELECT @.MAX_Priority=MAX(PRIORITY) FROM VOICE_FILE_PRIORITY with (nolock)
WHERE IMPORTANCE=@.STAT_FLAG
ELSE
BEGIN
SELECT @.PRIORITY=PRIORITY FROM ACCOUNT with (nolock) WHERE
ACCOUNTID=@.ACCOUNTID
IF @.PRIORITY is null
set @.PRIORITY=0
IF @.PRIORITY = 1
BEGIN
SELECT @.MAX_Priority=MAX(PRIORITY) FROM VOICE_FILE_PRIORITY with (nolock)
WHERE IMPORTANCE='N'
set @.STAT_FLAG='N'
END
ELSE
BEGIN
SELECT @.MAX_Priority=MAX(PRIORITY) FROM VOICE_FILE_PRIORITY with (nolock)
WHERE IMPORTANCE='L'
set @.STAT_FLAG='L'
END
END
if @.MAX_Priority is null
set @.MAX_Priority = 0
set @.MAX_Priority = @.MAX_Priority + 1
SELECT @.TRANS_VOICE_WEIGHT=TRANS_VOICE_WEIGHT FROM ACCOUNT_WEIGHTS_EXCP with
(nolock) WHERE ACCOUNTID=@.ACCOUNTID
AND PROVIDER_ID=@.PROVIDER_ID AND EMPID=@.TR
if @.TRANS_VOICE_WEIGHT is not null
SET @.WEIGHTED_TR_DURATION = @.TRANS_VOICE_WEIGHT * @.DURATION
--SELECT @.DICTATOR=FIRST_NAME + ' ' + LAST_NAME FROM PROVIDER WHERE
PROVIDER_ID=@.PROVIDER_ID
SELECT @.DICTATOR=DICTATED_BY FROM PROVIDER with (nolock) WHERE
PROVIDER_ID=@.PROVIDER_ID
SELECT @.FILE_ASSIGNED_DATE = dbo. sfd_fn_File_Assigned_Date(@.TR,getdate())
SET @.FILE_ASSIGNED_DATE = CONVERT(VARCHAR(12),@.FILE_ASSIGNED_DATE,
101)
BEGIN transaction
Insert into
dbo. Distribution(VOICE_FILE_LOCATION,VOICE_F
ILE_NAME,ASSIGNED_TO_TR,TR_SHIFT
_ID,NOTES,
TR_ASSIGNED_TIME) values (@.VOICE_FILE_LOCATION,@.VOICE_FILE_NAME,@.
TR,@.SHIFT_I
D
,'Distributed to Tr',GETDATE())
If @.@.error != 0
BEGIN
rollback transaction
RETURN 0
END
IF EXISTS(SELECT EMPID from emp_assigned_workload WHERE EMPID=@.TR AND
FILE_ASSIGNED_DATE=@.FILE_ASSIGNED_DATE
AND SHIFT_ID=@.SHIFT_ID)
Update EMP_ASSIGNED_WORKLOAD with (updlock) SET
WORK_ASSIGNED=WORK_ASSIGNED+@.WEIGHTED_TR
_DURATION,
TR_WORK_ASSIGNED=TR_WORK_ASSIGNED+@.DURAT
ION WHERE EMPID=@.TR AND
FILE_ASSIGNED_DATE=@.FILE_ASSIGNED_DATE
AND SHIFT_ID=@.SHIFT_ID
ELSE
INSERT INTO
EMP_ASSIGNED_WORKLOAD(FILE_ASSIGNED_DATE
,EMPID,PR_WORK_COMPLETED,TR_WORK_COM
PLETED,
UNDER_TRANSCRIPTION,READY_FOR_PROOFREADI
NG,PR_WORK_ASSIGNED,TR_WORK_ASSIGNED
,SHIFT_ID,
WORK_ASSIGNED) VALUES (@.FILE_ASSIGNED_DATE,@.TR,0,0,0,0,0,@.DURA
TION,@.SHIFT_ID
,
@.WEIGHTED_TR_DURATION)
If @.@.error != 0 OR @.@.ROWCOUNT=0
BEGIN
rollback transaction
RETURN -10
END
INSERT INTO
VOICE_FILE_PRIORITY(VOICE_FILE_LOCATION,
VOICE_FILE_NAME,ACCOUNT_ID,PROVIDER_
ID,
PRIORITY,ASSIGNED_TO_TR,ASSIGNED_TO_PR,I
MPORTANCE,STATUS,PENDINGSTATUS)
VALUES
(@.VOICE_FILE_LOCATION,@.VOICE_FILE_NAME,@.
ACCOUNTID,@.PROVIDER_ID,
@.MAX_Priority,@.TR ,NULL,@.STAT_FLAG,'N',NULL)
If @.@.error != 0
BEGIN
rollback transaction
RETURN 0
END
-- written by raghu for deadlock
select @.MASTER_BLOCKED = blocked from dbo.master.sysprocesses with (nolock)
where blocked<>0
if @.MASTER_BLOCKED=0
begin
UPDATE VOICE_FILES with (updlock) SET STATUS='T',TYPE= CASE WHEN TYPE='B'
OR TYPE='R' THEN 'N' ELSE TYPE END,UPDATE_TIME=getdate()
WHERE VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND
VOICE_FILE_NAME=@.VOICE_FILE_NAME
If @.@.error <> 0 or @.@.rowcount=0
BEGIN
rollback transaction
RETURN 0
END
end
else
begin
SET LOCK_TIMEOUT 30
if @.@.LOCK_TIMEOUT= 30
rollback transaction
RETURN 0
end
-- end by raghu
COMMIT TRANSACTION
RETURN 1
GO
--end spHi
Please read this article
http://www.sql-server-performance.com/deadlocks.asp
"raghu veer" <raghu veer@.discussions.microsoft.com> wrote in message
news:E05516F6-C1D4-418F-9111-C7EFD74B5BF3@.microsoft.com...
>i have 2 stored procedures
> 1st sp
> CREATE procedure dbo.sfd_sp_Assign_PR
> @.VOICE_FILE_LOCATION VARCHAR(255),
> @.VOICE_FILE_NAME VARCHAR(255),
> @.PR VARCHAR(10),
> @.TYPE CHAR(1),
> @.ACCOUNTID varchar(10) OUTPUT,
> @.DICTATOR VARCHAR(50) OUTPUT
> AS
> DECLARE @.Count as int
> DECLARE @.LAST_PR as VARCHAR(10)
> DECLARE @.TR as VARCHAR(10)
> DECLARE @.PROVIDER_ID as smallint
> DECLARE @.DURATION as int
> DECLARE @.SHIFT_ID as varchar(10)
> DECLARE @.TR_SHIFT_ID as varchar(10)
> DECLARE @.FILE_ASSIGNED_DATE as datetime
> DECLARE @.TR_ASSIGNED_TIME as datetime
> DECLARE @.undertranscription as int
> DECLARE @.readyforproofreading as int
> DECLARE @.MaxSequence as int
> DECLARE @.WEIGHTED_PR_DURATION as int
> DECLARE @.PR_VOICE_WEIGHT as int
> DECLARE @.TR_STATUS AS CHAR(1)
> DECLARE @.PR_DOC_FILE_NAME AS VARCHAR(255)
> DECLARE @.PR_DOC_FILE_LOCATION AS VARCHAR(255)
> DECLARE @.PATIENT_NAME AS VARCHAR(50)
> DECLARE @.MRN AS VARCHAR(20)
> DECLARE @.VISIT_DATE AS SMALLDATETIME
> DECLARE @.TR_CHAR_COUNT AS INT
> DECLARE @.VF_START_TIME AS SMALLINT
> DECLARE @.VF_END_TIME AS SMALLINT
> DECLARE @.TR_NOTES AS VARCHAR(1000)
> DECLARE @.TR_CHECKIN_DATETIME AS DATETIME
> DECLARE @.REPORT_TYPE AS VARCHAR(50)
> DECLARE @.TR_PL_STATUS AS SMALLINT
> DECLARE @.LOCATIONID AS SMALLINT
> DECLARE @.TR_TRANSCRIPTS CURSOR
> SELECT @.ACCOUNTID=ACCOUNTID,@.PROVIDER_ID=PROVID
ER_ID,@.DURATION=DURATION,
> @.WEIGHTED_PR_DURATION=WEIGHTED_PR_DURATI
ON FROM VOICE_FILES with (nolock)
> WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> IF @.ACCOUNTID is NULL
> return -1 --No record in voice files
> SELECT @.Count=COUNT(*) FROM ACCOUNT_WEIGHTS with (nolock) WHERE
> ACCOUNTID=@.ACCOUNTID AND PROVIDER_ID=@.PROVIDER_ID
> If @.Count = 0
> return -2 --No record in account weights
> SELECT @.Count=count(*) from DISTRIBUTION with (nolock) where
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> If @.Count = 0
> return -3 --File not assigned to TR for transcription
> SELECT @.Count=count(*) FROM VOICE_FILE_PRIORITY with (nolock) WHERE
> VOICE_FILE_NAME=@.VOICE_FILE_NAME AND
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> If @.Count = 0
> return -4 --No record in voice file priority
> SELECT assigned_to_pr FROM DISTRIBUTION with (nolock) WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME and ASSIGNED_TO_PR=@.PR
> if @.@.rowcount=1
> return -5 --file already assigned to selected PR
> SELECT @.SHIFT_ID=SHIFT_ID FROM EMP_SHIFT with (nolock) WHERE EMPID=@.PR AND
> getdate() >= EFFECTIVE_DATE AND DAY_OF_WEEK = DATEPART(dw,getdate())
> If @.SHIFT_ID IS NULL
> return -6 --Shift ID not found
> SET @.undertranscription = 0
> SET @.readyforproofreading = 0
> SELECT @.MaxSequence=max(sequence) from distribution with (nolock) WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> SELECT @.LAST_PR=ASSIGNED_TO_PR FROM DISTRIBUTION with (nolock) WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME and sequence=@.MaxSequence
> IF @.MaxSequence=1 AND @.LAST_PR IS NULL
> BEGIN
> SELECT @.Count=COUNT(*) FROM VF_TR_ASSIGN with (nolock) WHERE STATUS in
> ('A','O') AND VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> IF @.Count > 0
> SET @.undertranscription = @.Duration
> SELECT @.Count=COUNT(*) FROM VF_TR_ASSIGN with (nolock) WHERE STATUS='C'
> AND
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> IF @.Count > 0
> SET @.readyforproofreading = @.Duration
> END
> SELECT @.PR_VOICE_WEIGHT=PR_VOICE_WEIGHT FROM ACCOUNT_WEIGHTS_EXCP with
> (nolock) WHERE ACCOUNTID=@.ACCOUNTID
> AND PROVIDER_ID=@.PROVIDER_ID AND EMPID=@.PR
> if @.PR_VOICE_WEIGHT IS NOT NULL
> SET @.WEIGHTED_PR_DURATION = @.PR_VOICE_WEIGHT * @.DURATION
> --SELECT @.DICTATOR=FIRST_NAME + ' ' + LAST_NAME FROM PROVIDER WHERE
> PROVIDER_ID=@.PROVIDER_ID
> SELECT @.DICTATOR=DICTATED_BY FROM PROVIDER WHERE PROVIDER_ID=@.PROVIDER_ID
> SELECT @.FILE_ASSIGNED_DATE=dbo. sfd_fn_File_Assigned_Date(@.PR,getdate())
> SET @.FILE_ASSIGNED_DATE=CONVERT(VARCHAR(12),
@.FILE_ASSIGNED_DATE,101)
>
> BEGIN TRANSACTION
> IF @.LAST_PR IS NULL AND @.MaxSequence=1
> BEGIN
> UPDATE TR_TRANSCRIPTS with (updlock) SET ASSIGNED_TO_PR=@.PR WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> If @.@.ERROR !=0
> BEGIN
> ROLLBACK TRANSACTION
> RETURN 0
> END
> UPDATE DISTRIBUTION with (updlock) SET
> ASSIGNED_TO_PR=@.PR,PR_SHIFT_ID=@.SHIFT_ID
,
> PR_ASSIGNED_TIME=GETDATE(),DISTRIBUTION_
TYPE=@.TYPE WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME AND SEQUENCE=1
> If @.@.ERROR !=0
> BEGIN
> ROLLBACK TRANSACTION
> RETURN 0
> END
> UPDATE VOICE_FILE_PRIORITY with (updlock) SET ASSIGNED_TO_PR=@.PR WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> If @.@.ERROR != 0
> BEGIN
> ROLLBACK TRANSACTION
> RETURN 0
> END
> END
> ELSE
> BEGIN
> SELECT @.TR_STATUS=TR_STATUS, @.TR=ASSIGNED_TO_TR, @.TR_SHIFT_ID=TR_SHIFT_ID,
> @.TR_ASSIGNED_TIME=TR_ASSIGNED_TIME
> FROM DISTRIBUTION with (nolock) WHERE sequence=1 AND
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> INSERT INTO DISTRIBUTION (VOICE_FILE_LOCATION, VOICE_FILE_NAME,
> TR_STATUS,SEQUENCE,NOTES,PR_STATUS,ASSIG
NED_TO_TR,ASSIGNED_TO_PR,TR_SHIFT_
ID,PR_SHIFT_ID,TR_ASSIGNED_TIME,PR_ASSIG
NED_TIME,DISTRIBUTION_TYPE)
> values
> (@.VOICE_FILE_LOCATION, @.VOICE_FILE_NAME, @.TR_STATUS, @.MaxSequence+1,
> 'Distributed to Tr', 'N', @.TR, @.PR, @.TR_SHIFT_ID, @.SHIFT_ID,
> @.TR_ASSIGNED_TIME, GETDATE(),@.TYPE)
> -- SELECT @.COUNT=COUNT(*) FROM TR_TRANSCRIPTS WHERE PR_STATUS IN ('N','P')
> AND VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> -- AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> -- IF @.COUNT = 0
> -- BEGIN
> -- SELECT @.COUNT=COUNT(*) FROM TR_TRANSCRIPTS WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> -- AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> -- IF @.COUNT > 0
> -- BEGIN
> UPDATE VOICE_FILE_PRIORITY with (updlock) SET ASSIGNED_TO_PR=@.PR WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME AND ASSIGNED_TO_PR IS NULL
> If @.@.ERROR != 0
> BEGIN
> ROLLBACK TRANSACTION
> RETURN 0
> END
> -- END
> -- END
> SET @.TR_TRANSCRIPTS = CURSOR FOR
> SELECT
> PATIENT_NAME,MRN,VISIT_DATE,TR_CHAR_COUN
T,PR_DOC_FILE_NAME,PR_DOC_FILE_LOC
ATION,VF_START_TIME,VF_END_TIME,TR_NOTES
,REPORT_TYPE,TR_CHECKIN_DATETIME,TR_
PL_STATUS,ASSIGNED_TO_TR,LOCATIONID
> FROM TR_TRANSCRIPTS with (nolock) where ASSIGNED_TO_PR=@.LAST_PR AND
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME AND PR_DOC_FILE_NAME IS NOT NULL
> OPEN @.TR_TRANSCRIPTS
> FETCH NEXT FROM @.TR_TRANSCRIPTS INTO
> @.PATIENT_NAME,@.MRN,@.VISIT_DATE,@.TR_CHAR_
COUNT,@.PR_DOC_FILE_NAME,@.PR_DOC_FI
LE_LOCATION,@.VF_START_TIME,@.VF_END_TIME,
@.TR_NOTES,@.REPORT_TYPE,@.TR_CHECKIN_D
ATETIME,@.TR_PL_STATUS,@.TR,@.LOCATIONID
> WHILE (@.@.FETCH_STATUS = 0)
> BEGIN
> INSERT INTO
> TR_TRANSCRIPTS(DOC_FILE_NAME,DOC_FILE_LO
CATION,PATIENT_NAME,MRN,VISIT_DATE,TRANS
CR
IPTION_STATUS,TR_CHAR_COUNT,VOICE_FILE_N
AME,VOICE_FILE_LOCATION,ASSIGNED_TO_TR,T
R_CH
ECKIN_DATETIME,PR_STATUS,VF_START_TIME,V
F_END_TIME,TR_NOTES,REPORT_TYPE,TR_PL_ST
ATUS
,AS
SIGNED_TO_PR,LOCATIONID)
> VALUES
> (@.PR_DOC_FILE_NAME,@.PR_DOC_FILE_LOCATION
,@.PATIENT_NAME,@.MRN,@.VISIT_DATE,'A
',@.TR_CHAR_COUNT,@.VOICE_FILE_NAME,@.VOICE
_FILE_LOCATION,@.TR,@.TR_CHECKIN_DATET
IME,'N',@.VF_START_TIME,@.VF_END_TIME,@.TR_
NOTES,@.REPORT_TYPE,@.TR_PL_STATUS,@.PR
,@.LOCATIONID)
> SET @.undertranscription = 0
> SET @.readyforproofreading = @.Duration
> FETCH NEXT FROM @.TR_TRANSCRIPTS INTO
> @.PATIENT_NAME,@.MRN,@.VISIT_DATE,@.TR_CHAR_
COUNT,@.PR_DOC_FILE_NAME,@.PR_DOC_FI
LE_LOCATION,@.VF_START_TIME,@.VF_END_TIME,
@.TR_NOTES,@.REPORT_TYPE,@.TR_CHECKIN_D
ATETIME,@.TR_PL_STATUS,@.TR,@.LOCATIONID
> END
> CLOSE @.TR_TRANSCRIPTS
> DEALLOCATE @.TR_TRANSCRIPTS
>
> --UPDATE EMP_ASSIGNED_WORKLOAD
> END
> --common
> UPDATE VOICE_FILES with (updlock) SET STATUS='A',TYPE= CASE WHEN TYPE='B'
> OR TYPE='R' THEN 'N' ELSE TYPE END WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND
> VOICE_FILE_NAME=@.VOICE_FILE_NAME
> If @.@.ERROR !=0
> BEGIN
> ROLLBACK TRANSACTION
> RETURN 0
> END
> IF EXISTS(SELECT empid from emp_assigned_workload with (nolock) WHERE
> EMPID=@.PR AND FILE_ASSIGNED_DATE=@.FILE_ASSIGNED_DATE
> AND SHIFT_ID=@.SHIFT_ID)
> UPDATE EMP_ASSIGNED_WORKLOAD with (updlock) SET
> UNDER_TRANSCRIPTION=UNDER_TRANSCRIPTION+
@.undertranscription,READY_FOR_PROO
FREADING=READY_FOR_PROOFREADING+@.readyfo
rproofreading,
> WORK_ASSIGNED=WORK_ASSIGNED+@.WEIGHTED_PR
_DURATION,
> PR_WORK_ASSIGNED=PR_WORK_ASSIGNED+@.DURAT
ION
> WHERE EMPID=@.PR AND FILE_ASSIGNED_DATE=@.FILE_ASSIGNED_DATE AND
> SHIFT_ID=@.SHIFT_ID
> ELSE
> INSERT INTO
> EMP_ASSIGNED_WORKLOAD(FILE_ASSIGNED_DATE
,EMPID,PR_WORK_COMPLETED,TR_WORK_C
OMPLETED,
> UNDER_TRANSCRIPTION,READY_FOR_PROOFREADI
NG,PR_WORK_ASSIGNED,TR_WORK_ASSIGN
ED,SHIFT_ID,
> WORK_ASSIGNED) VALUES (@.FILE_ASSIGNED_DATE,@.PR,0,0,@.undertrans
cription,
> @.readyforproofreading,@.DURATION,0,@.SHIFT
_ID,@.WEIGHTED_PR_DURATION)
> If @.@.ERROR !=0 OR @.@.ROWCOUNT=0
> BEGIN
> ROLLBACK TRANSACTION
> RETURN -10
> END
> COMMIT TRANSACTION
> RETURN 1
> GO
> --end 1st sp
> 2nd sp
> CREATE procedure dbo.sfd_sp_Assign_TR
> @.VOICE_FILE_LOCATION VARCHAR(255),
> @.VOICE_FILE_NAME VARCHAR(255),
> @.TR VARCHAR(10),
> @.ACCOUNTID varchar(10) output,
> @.DICTATOR VARCHAR(50) output
> AS
> DECLARE @.Count as int
> DECLARE @.PROVIDER_ID as smallint
> DECLARE @.WEIGHTED_TR_DURATION as int
> DECLARE @.DURATION as int
> DECLARE @.SHIFT_ID as varchar(10)
> DECLARE @.STAT_FLAG as char(1)
> DECLARE @.MAX_Priority as int
> DECLARE @.PRIORITY as bit
> DECLARE @.FILE_ASSIGNED_DATE as datetime
> DECLARE @.TRANS_VOICE_WEIGHT AS int
> DECLARE @.MASTER_BLOCKED AS int
> SELECT @.ACCOUNTID=ACCOUNTID,@.PROVIDER_ID=PROVID
ER_ID,@.DURATION=DURATION,
> @.WEIGHTED_TR_DURATION=WEIGHTED_TR_DURATI
ON,@.STAT_FLAG=STAT_FLAG FROM
> VOICE_FILES with (nolock) WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> IF @.ACCOUNTID is NULL
> return -1 --No record in voice files
> SELECT @.Count=COUNT(*) FROM ACCOUNT_WEIGHTS WHERE ACCOUNTID=@.ACCOUNTID AND
> PROVIDER_ID=@.PROVIDER_ID
> If @.Count = 0
> return -2 --No record in account weights
> SELECT @.Count=count(*) from vf_tr_assign where
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> If @.Count > 0
> return -3 --TR has already started working on the file
> SELECT @.SHIFT_ID=SHIFT_ID FROM EMP_SHIFT with (nolock) WHERE EMPID=@.TR AND
> getdate() >= EFFECTIVE_DATE AND DAY_OF_WEEK = datepart(dw,getdate())
> If @.SHIFT_ID is null
> return -4 --Shift ID not found
> SELECT @.Count=count(*) from DISTRIBUTION where
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> If @.Count > 0
> return -5 --File already assigned for transcription
> if @.STAT_FLAG='S' or @.STAT_FLAG='P'
> SELECT @.MAX_Priority=MAX(PRIORITY) FROM VOICE_FILE_PRIORITY with (nolock)
> WHERE IMPORTANCE=@.STAT_FLAG
> ELSE
> BEGIN
> SELECT @.PRIORITY=PRIORITY FROM ACCOUNT with (nolock) WHERE
> ACCOUNTID=@.ACCOUNTID
> IF @.PRIORITY is null
> set @.PRIORITY=0
> IF @.PRIORITY = 1
> BEGIN
> SELECT @.MAX_Priority=MAX(PRIORITY) FROM VOICE_FILE_PRIORITY with (nolock)
> WHERE IMPORTANCE='N'
> set @.STAT_FLAG='N'
> END
> ELSE
> BEGIN
> SELECT @.MAX_Priority=MAX(PRIORITY) FROM VOICE_FILE_PRIORITY with (nolock)
> WHERE IMPORTANCE='L'
> set @.STAT_FLAG='L'
> END
> END
> if @.MAX_Priority is null
> set @.MAX_Priority = 0
> set @.MAX_Priority = @.MAX_Priority + 1
> SELECT @.TRANS_VOICE_WEIGHT=TRANS_VOICE_WEIGHT FROM ACCOUNT_WEIGHTS_EXCP
> with
> (nolock) WHERE ACCOUNTID=@.ACCOUNTID
> AND PROVIDER_ID=@.PROVIDER_ID AND EMPID=@.TR
> if @.TRANS_VOICE_WEIGHT is not null
> SET @.WEIGHTED_TR_DURATION = @.TRANS_VOICE_WEIGHT * @.DURATION
> --SELECT @.DICTATOR=FIRST_NAME + ' ' + LAST_NAME FROM PROVIDER WHERE
> PROVIDER_ID=@.PROVIDER_ID
> SELECT @.DICTATOR=DICTATED_BY FROM PROVIDER with (nolock) WHERE
> PROVIDER_ID=@.PROVIDER_ID
> SELECT @.FILE_ASSIGNED_DATE = dbo. sfd_fn_File_Assigned_Date(@.TR,getdate())
> SET @.FILE_ASSIGNED_DATE = CONVERT(VARCHAR(12),@.FILE_ASSIGNED_DATE,
101)
> BEGIN transaction
> Insert into
> dbo. Distribution(VOICE_FILE_LOCATION,VOICE_F
ILE_NAME,ASSIGNED_TO_TR,TR_SHI
FT_ID,NOTES,
> TR_ASSIGNED_TIME) values
> (@.VOICE_FILE_LOCATION,@.VOICE_FILE_NAME,@.
TR,@.SHIFT_ID
> ,'Distributed to Tr',GETDATE())
> If @.@.error != 0
> BEGIN
> rollback transaction
> RETURN 0
> END
> IF EXISTS(SELECT EMPID from emp_assigned_workload WHERE EMPID=@.TR AND
> FILE_ASSIGNED_DATE=@.FILE_ASSIGNED_DATE
> AND SHIFT_ID=@.SHIFT_ID)
> Update EMP_ASSIGNED_WORKLOAD with (updlock) SET
> WORK_ASSIGNED=WORK_ASSIGNED+@.WEIGHTED_TR
_DURATION,
> TR_WORK_ASSIGNED=TR_WORK_ASSIGNED+@.DURAT
ION WHERE EMPID=@.TR AND
> FILE_ASSIGNED_DATE=@.FILE_ASSIGNED_DATE
> AND SHIFT_ID=@.SHIFT_ID
> ELSE
> INSERT INTO
> EMP_ASSIGNED_WORKLOAD(FILE_ASSIGNED_DATE
,EMPID,PR_WORK_COMPLETED,TR_WORK_C
OMPLETED,
> UNDER_TRANSCRIPTION,READY_FOR_PROOFREADI
NG,PR_WORK_ASSIGNED,TR_WORK_ASSIGN
ED,SHIFT_ID,
> WORK_ASSIGNED) VALUES
> (@.FILE_ASSIGNED_DATE,@.TR,0,0,0,0,0,@.DURA
TION,@.SHIFT_ID,
> @.WEIGHTED_TR_DURATION)
> If @.@.error != 0 OR @.@.ROWCOUNT=0
> BEGIN
> rollback transaction
> RETURN -10
> END
> INSERT INTO
> VOICE_FILE_PRIORITY(VOICE_FILE_LOCATION,
VOICE_FILE_NAME,ACCOUNT_ID,PROVIDE
R_ID,
> PRIORITY,ASSIGNED_TO_TR,ASSIGNED_TO_PR,I
MPORTANCE,STATUS,PENDINGSTATUS)
> VALUES
> (@.VOICE_FILE_LOCATION,@.VOICE_FILE_NAME,@.
ACCOUNTID,@.PROVIDER_ID,
> @.MAX_Priority,@.TR ,NULL,@.STAT_FLAG,'N',NULL)
> If @.@.error != 0
> BEGIN
> rollback transaction
> RETURN 0
> END
> -- written by raghu for deadlock
> select @.MASTER_BLOCKED = blocked from dbo.master.sysprocesses with
> (nolock)
> where blocked<>0
> if @.MASTER_BLOCKED=0
> begin
> UPDATE VOICE_FILES with (updlock) SET STATUS='T',TYPE= CASE WHEN TYPE='B'
> OR TYPE='R' THEN 'N' ELSE TYPE END,UPDATE_TIME=getdate()
> WHERE VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND
> VOICE_FILE_NAME=@.VOICE_FILE_NAME
> If @.@.error <> 0 or @.@.rowcount=0
> BEGIN
> rollback transaction
> RETURN 0
> END
> end
> else
> begin
> SET LOCK_TIMEOUT 30
> if @.@.LOCK_TIMEOUT= 30
> rollback transaction
> RETURN 0
> end
> -- end by raghu
>
>
> COMMIT TRANSACTION
> RETURN 1
> GO
>
> --end sp|||You should really be careful about using WITH(NOLOCK) when SELECTing
information that will be used in an INSERT or UPDATE. It can allow garbage
to be stored in the database.
At first glance, I notice a pattern that I would do different. I would
apply the update lock when you read the row to be updated. For example:
IF EXISTS(SELECT...FROM...WITH(UPDLOCK) WHERE...)
UPDATE...
With your code (depending on the transaction isolation level), the SELECT
will obtain a shared lock and then the UPDATE will attempt to obtain an
exclusive lock. This can cause a deadlock because more than one transaction
can obtain a shared lock, and then neither can obtain an exclusive lock
because both transactions have a shared lock.
You should avoid using a cursor within a transaction.
WITH(UPDLOCK) on a single-row update doesn't accomplish anything, because an
UPDATE always applies an exclusive lock on any row that is updated.
Also, there's nothing evil about using GOTO for error handling.
After further examination, these procedures are a disaster waiting to
happen. You really need to learn how locking works in SQL Server. You need
to learn about transaction isolation levels and how each affects lock
duration. You need to learn about how concurrent transactions
interact--especially when using WITH(NOLOCK). You also need to learn how to
write set-based statements instead of using cursors. In addition, you
should learn about optimistic concurrency, how to use rowversion (timestamp)
columns, and how to recover from collisions.
"raghu veer" <raghu veer@.discussions.microsoft.com> wrote in message
news:E05516F6-C1D4-418F-9111-C7EFD74B5BF3@.microsoft.com...
>i have 2 stored procedures
> 1st sp
> CREATE procedure dbo.sfd_sp_Assign_PR
> @.VOICE_FILE_LOCATION VARCHAR(255),
> @.VOICE_FILE_NAME VARCHAR(255),
> @.PR VARCHAR(10),
> @.TYPE CHAR(1),
> @.ACCOUNTID varchar(10) OUTPUT,
> @.DICTATOR VARCHAR(50) OUTPUT
> AS
> DECLARE @.Count as int
> DECLARE @.LAST_PR as VARCHAR(10)
> DECLARE @.TR as VARCHAR(10)
> DECLARE @.PROVIDER_ID as smallint
> DECLARE @.DURATION as int
> DECLARE @.SHIFT_ID as varchar(10)
> DECLARE @.TR_SHIFT_ID as varchar(10)
> DECLARE @.FILE_ASSIGNED_DATE as datetime
> DECLARE @.TR_ASSIGNED_TIME as datetime
> DECLARE @.undertranscription as int
> DECLARE @.readyforproofreading as int
> DECLARE @.MaxSequence as int
> DECLARE @.WEIGHTED_PR_DURATION as int
> DECLARE @.PR_VOICE_WEIGHT as int
> DECLARE @.TR_STATUS AS CHAR(1)
> DECLARE @.PR_DOC_FILE_NAME AS VARCHAR(255)
> DECLARE @.PR_DOC_FILE_LOCATION AS VARCHAR(255)
> DECLARE @.PATIENT_NAME AS VARCHAR(50)
> DECLARE @.MRN AS VARCHAR(20)
> DECLARE @.VISIT_DATE AS SMALLDATETIME
> DECLARE @.TR_CHAR_COUNT AS INT
> DECLARE @.VF_START_TIME AS SMALLINT
> DECLARE @.VF_END_TIME AS SMALLINT
> DECLARE @.TR_NOTES AS VARCHAR(1000)
> DECLARE @.TR_CHECKIN_DATETIME AS DATETIME
> DECLARE @.REPORT_TYPE AS VARCHAR(50)
> DECLARE @.TR_PL_STATUS AS SMALLINT
> DECLARE @.LOCATIONID AS SMALLINT
> DECLARE @.TR_TRANSCRIPTS CURSOR
> SELECT @.ACCOUNTID=ACCOUNTID,@.PROVIDER_ID=PROVID
ER_ID,@.DURATION=DURATION,
> @.WEIGHTED_PR_DURATION=WEIGHTED_PR_DURATI
ON FROM VOICE_FILES with (nolock)
> WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> IF @.ACCOUNTID is NULL
> return -1 --No record in voice files
> SELECT @.Count=COUNT(*) FROM ACCOUNT_WEIGHTS with (nolock) WHERE
> ACCOUNTID=@.ACCOUNTID AND PROVIDER_ID=@.PROVIDER_ID
> If @.Count = 0
> return -2 --No record in account weights
> SELECT @.Count=count(*) from DISTRIBUTION with (nolock) where
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> If @.Count = 0
> return -3 --File not assigned to TR for transcription
> SELECT @.Count=count(*) FROM VOICE_FILE_PRIORITY with (nolock) WHERE
> VOICE_FILE_NAME=@.VOICE_FILE_NAME AND
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> If @.Count = 0
> return -4 --No record in voice file priority
> SELECT assigned_to_pr FROM DISTRIBUTION with (nolock) WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME and ASSIGNED_TO_PR=@.PR
> if @.@.rowcount=1
> return -5 --file already assigned to selected PR
> SELECT @.SHIFT_ID=SHIFT_ID FROM EMP_SHIFT with (nolock) WHERE EMPID=@.PR AND
> getdate() >= EFFECTIVE_DATE AND DAY_OF_WEEK = DATEPART(dw,getdate())
> If @.SHIFT_ID IS NULL
> return -6 --Shift ID not found
> SET @.undertranscription = 0
> SET @.readyforproofreading = 0
> SELECT @.MaxSequence=max(sequence) from distribution with (nolock) WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> SELECT @.LAST_PR=ASSIGNED_TO_PR FROM DISTRIBUTION with (nolock) WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME and sequence=@.MaxSequence
> IF @.MaxSequence=1 AND @.LAST_PR IS NULL
> BEGIN
> SELECT @.Count=COUNT(*) FROM VF_TR_ASSIGN with (nolock) WHERE STATUS in
> ('A','O') AND VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> IF @.Count > 0
> SET @.undertranscription = @.Duration
> SELECT @.Count=COUNT(*) FROM VF_TR_ASSIGN with (nolock) WHERE STATUS='C'
> AND
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> IF @.Count > 0
> SET @.readyforproofreading = @.Duration
> END
> SELECT @.PR_VOICE_WEIGHT=PR_VOICE_WEIGHT FROM ACCOUNT_WEIGHTS_EXCP with
> (nolock) WHERE ACCOUNTID=@.ACCOUNTID
> AND PROVIDER_ID=@.PROVIDER_ID AND EMPID=@.PR
> if @.PR_VOICE_WEIGHT IS NOT NULL
> SET @.WEIGHTED_PR_DURATION = @.PR_VOICE_WEIGHT * @.DURATION
> --SELECT @.DICTATOR=FIRST_NAME + ' ' + LAST_NAME FROM PROVIDER WHERE
> PROVIDER_ID=@.PROVIDER_ID
> SELECT @.DICTATOR=DICTATED_BY FROM PROVIDER WHERE PROVIDER_ID=@.PROVIDER_ID
> SELECT @.FILE_ASSIGNED_DATE=dbo. sfd_fn_File_Assigned_Date(@.PR,getdate())
> SET @.FILE_ASSIGNED_DATE=CONVERT(VARCHAR(12),
@.FILE_ASSIGNED_DATE,101)
>
> BEGIN TRANSACTION
> IF @.LAST_PR IS NULL AND @.MaxSequence=1
> BEGIN
> UPDATE TR_TRANSCRIPTS with (updlock) SET ASSIGNED_TO_PR=@.PR WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> If @.@.ERROR !=0
> BEGIN
> ROLLBACK TRANSACTION
> RETURN 0
> END
> UPDATE DISTRIBUTION with (updlock) SET
> ASSIGNED_TO_PR=@.PR,PR_SHIFT_ID=@.SHIFT_ID
,
> PR_ASSIGNED_TIME=GETDATE(),DISTRIBUTION_
TYPE=@.TYPE WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME AND SEQUENCE=1
> If @.@.ERROR !=0
> BEGIN
> ROLLBACK TRANSACTION
> RETURN 0
> END
> UPDATE VOICE_FILE_PRIORITY with (updlock) SET ASSIGNED_TO_PR=@.PR WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> If @.@.ERROR != 0
> BEGIN
> ROLLBACK TRANSACTION
> RETURN 0
> END
> END
> ELSE
> BEGIN
> SELECT @.TR_STATUS=TR_STATUS, @.TR=ASSIGNED_TO_TR, @.TR_SHIFT_ID=TR_SHIFT_ID,
> @.TR_ASSIGNED_TIME=TR_ASSIGNED_TIME
> FROM DISTRIBUTION with (nolock) WHERE sequence=1 AND
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> INSERT INTO DISTRIBUTION (VOICE_FILE_LOCATION, VOICE_FILE_NAME,
> TR_STATUS,SEQUENCE,NOTES,PR_STATUS,ASSIG
NED_TO_TR,ASSIGNED_TO_PR,TR_SHIFT_
ID,PR_SHIFT_ID,TR_ASSIGNED_TIME,PR_ASSIG
NED_TIME,DISTRIBUTION_TYPE)
> values
> (@.VOICE_FILE_LOCATION, @.VOICE_FILE_NAME, @.TR_STATUS, @.MaxSequence+1,
> 'Distributed to Tr', 'N', @.TR, @.PR, @.TR_SHIFT_ID, @.SHIFT_ID,
> @.TR_ASSIGNED_TIME, GETDATE(),@.TYPE)
> -- SELECT @.COUNT=COUNT(*) FROM TR_TRANSCRIPTS WHERE PR_STATUS IN ('N','P')
> AND VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> -- AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> -- IF @.COUNT = 0
> -- BEGIN
> -- SELECT @.COUNT=COUNT(*) FROM TR_TRANSCRIPTS WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> -- AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> -- IF @.COUNT > 0
> -- BEGIN
> UPDATE VOICE_FILE_PRIORITY with (updlock) SET ASSIGNED_TO_PR=@.PR WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME AND ASSIGNED_TO_PR IS NULL
> If @.@.ERROR != 0
> BEGIN
> ROLLBACK TRANSACTION
> RETURN 0
> END
> -- END
> -- END
> SET @.TR_TRANSCRIPTS = CURSOR FOR
> SELECT
> PATIENT_NAME,MRN,VISIT_DATE,TR_CHAR_COUN
T,PR_DOC_FILE_NAME,PR_DOC_FILE_LOC
ATION,VF_START_TIME,VF_END_TIME,TR_NOTES
,REPORT_TYPE,TR_CHECKIN_DATETIME,TR_
PL_STATUS,ASSIGNED_TO_TR,LOCATIONID
> FROM TR_TRANSCRIPTS with (nolock) where ASSIGNED_TO_PR=@.LAST_PR AND
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME AND PR_DOC_FILE_NAME IS NOT NULL
> OPEN @.TR_TRANSCRIPTS
> FETCH NEXT FROM @.TR_TRANSCRIPTS INTO
> @.PATIENT_NAME,@.MRN,@.VISIT_DATE,@.TR_CHAR_
COUNT,@.PR_DOC_FILE_NAME,@.PR_DOC_FI
LE_LOCATION,@.VF_START_TIME,@.VF_END_TIME,
@.TR_NOTES,@.REPORT_TYPE,@.TR_CHECKIN_D
ATETIME,@.TR_PL_STATUS,@.TR,@.LOCATIONID
> WHILE (@.@.FETCH_STATUS = 0)
> BEGIN
> INSERT INTO
> TR_TRANSCRIPTS(DOC_FILE_NAME,DOC_FILE_LO
CATION,PATIENT_NAME,MRN,VISIT_DATE,TRANS
CR
IPTION_STATUS,TR_CHAR_COUNT,VOICE_FILE_N
AME,VOICE_FILE_LOCATION,ASSIGNED_TO_TR,T
R_CH
ECKIN_DATETIME,PR_STATUS,VF_START_TIME,V
F_END_TIME,TR_NOTES,REPORT_TYPE,TR_PL_ST
ATUS
,AS
SIGNED_TO_PR,LOCATIONID)
> VALUES
> (@.PR_DOC_FILE_NAME,@.PR_DOC_FILE_LOCATION
,@.PATIENT_NAME,@.MRN,@.VISIT_DATE,'A
',@.TR_CHAR_COUNT,@.VOICE_FILE_NAME,@.VOICE
_FILE_LOCATION,@.TR,@.TR_CHECKIN_DATET
IME,'N',@.VF_START_TIME,@.VF_END_TIME,@.TR_
NOTES,@.REPORT_TYPE,@.TR_PL_STATUS,@.PR
,@.LOCATIONID)
> SET @.undertranscription = 0
> SET @.readyforproofreading = @.Duration
> FETCH NEXT FROM @.TR_TRANSCRIPTS INTO
> @.PATIENT_NAME,@.MRN,@.VISIT_DATE,@.TR_CHAR_
COUNT,@.PR_DOC_FILE_NAME,@.PR_DOC_FI
LE_LOCATION,@.VF_START_TIME,@.VF_END_TIME,
@.TR_NOTES,@.REPORT_TYPE,@.TR_CHECKIN_D
ATETIME,@.TR_PL_STATUS,@.TR,@.LOCATIONID
> END
> CLOSE @.TR_TRANSCRIPTS
> DEALLOCATE @.TR_TRANSCRIPTS
>
> --UPDATE EMP_ASSIGNED_WORKLOAD
> END
> --common
> UPDATE VOICE_FILES with (updlock) SET STATUS='A',TYPE= CASE WHEN TYPE='B'
> OR TYPE='R' THEN 'N' ELSE TYPE END WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND
> VOICE_FILE_NAME=@.VOICE_FILE_NAME
> If @.@.ERROR !=0
> BEGIN
> ROLLBACK TRANSACTION
> RETURN 0
> END
> IF EXISTS(SELECT empid from emp_assigned_workload with (nolock) WHERE
> EMPID=@.PR AND FILE_ASSIGNED_DATE=@.FILE_ASSIGNED_DATE
> AND SHIFT_ID=@.SHIFT_ID)
> UPDATE EMP_ASSIGNED_WORKLOAD with (updlock) SET
> UNDER_TRANSCRIPTION=UNDER_TRANSCRIPTION+
@.undertranscription,READY_FOR_PROO
FREADING=READY_FOR_PROOFREADING+@.readyfo
rproofreading,
> WORK_ASSIGNED=WORK_ASSIGNED+@.WEIGHTED_PR
_DURATION,
> PR_WORK_ASSIGNED=PR_WORK_ASSIGNED+@.DURAT
ION
> WHERE EMPID=@.PR AND FILE_ASSIGNED_DATE=@.FILE_ASSIGNED_DATE AND
> SHIFT_ID=@.SHIFT_ID
> ELSE
> INSERT INTO
> EMP_ASSIGNED_WORKLOAD(FILE_ASSIGNED_DATE
,EMPID,PR_WORK_COMPLETED,TR_WORK_C
OMPLETED,
> UNDER_TRANSCRIPTION,READY_FOR_PROOFREADI
NG,PR_WORK_ASSIGNED,TR_WORK_ASSIGN
ED,SHIFT_ID,
> WORK_ASSIGNED) VALUES (@.FILE_ASSIGNED_DATE,@.PR,0,0,@.undertrans
cription,
> @.readyforproofreading,@.DURATION,0,@.SHIFT
_ID,@.WEIGHTED_PR_DURATION)
> If @.@.ERROR !=0 OR @.@.ROWCOUNT=0
> BEGIN
> ROLLBACK TRANSACTION
> RETURN -10
> END
> COMMIT TRANSACTION
> RETURN 1
> GO
> --end 1st sp
> 2nd sp
> CREATE procedure dbo.sfd_sp_Assign_TR
> @.VOICE_FILE_LOCATION VARCHAR(255),
> @.VOICE_FILE_NAME VARCHAR(255),
> @.TR VARCHAR(10),
> @.ACCOUNTID varchar(10) output,
> @.DICTATOR VARCHAR(50) output
> AS
> DECLARE @.Count as int
> DECLARE @.PROVIDER_ID as smallint
> DECLARE @.WEIGHTED_TR_DURATION as int
> DECLARE @.DURATION as int
> DECLARE @.SHIFT_ID as varchar(10)
> DECLARE @.STAT_FLAG as char(1)
> DECLARE @.MAX_Priority as int
> DECLARE @.PRIORITY as bit
> DECLARE @.FILE_ASSIGNED_DATE as datetime
> DECLARE @.TRANS_VOICE_WEIGHT AS int
> DECLARE @.MASTER_BLOCKED AS int
> SELECT @.ACCOUNTID=ACCOUNTID,@.PROVIDER_ID=PROVID
ER_ID,@.DURATION=DURATION,
> @.WEIGHTED_TR_DURATION=WEIGHTED_TR_DURATI
ON,@.STAT_FLAG=STAT_FLAG FROM
> VOICE_FILES with (nolock) WHERE
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> IF @.ACCOUNTID is NULL
> return -1 --No record in voice files
> SELECT @.Count=COUNT(*) FROM ACCOUNT_WEIGHTS WHERE ACCOUNTID=@.ACCOUNTID AND
> PROVIDER_ID=@.PROVIDER_ID
> If @.Count = 0
> return -2 --No record in account weights
> SELECT @.Count=count(*) from vf_tr_assign where
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> If @.Count > 0
> return -3 --TR has already started working on the file
> SELECT @.SHIFT_ID=SHIFT_ID FROM EMP_SHIFT with (nolock) WHERE EMPID=@.TR AND
> getdate() >= EFFECTIVE_DATE AND DAY_OF_WEEK = datepart(dw,getdate())
> If @.SHIFT_ID is null
> return -4 --Shift ID not found
> SELECT @.Count=count(*) from DISTRIBUTION where
> VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
> AND VOICE_FILE_NAME=@.VOICE_FILE_NAME
> If @.Count > 0
> return -5 --File already assigned for transcription
> if @.STAT_FLAG='S' or @.STAT_FLAG='P'
> SELECT @.MAX_Priority=MAX(PRIORITY) FROM VOICE_FILE_PRIORITY with (nolock)
> WHERE IMPORTANCE=@.STAT_FLAG
> ELSE
> BEGIN
> SELECT @.PRIORITY=PRIORITY FROM ACCOUNT with (nolock) WHERE
> ACCOUNTID=@.ACCOUNTID
> IF @.PRIORITY is null
> set @.PRIORITY=0
> IF @.PRIORITY = 1
> BEGIN
> SELECT @.MAX_Priority=MAX(PRIORITY) FROM VOICE_FILE_PRIORITY with (nolock)
> WHERE IMPORTANCE='N'
> set @.STAT_FLAG='N'
> END
> ELSE
> BEGIN
> SELECT @.MAX_Priority=MAX(PRIORITY) FROM VOICE_FILE_PRIORITY with (nolock)
> WHERE IMPORTANCE='L'
> set @.STAT_FLAG='L'
> END
> END
> if @.MAX_Priority is null
> set @.MAX_Priority = 0
> set @.MAX_Priority = @.MAX_Priority + 1
> SELECT @.TRANS_VOICE_WEIGHT=TRANS_VOICE_WEIGHT FROM ACCOUNT_WEIGHTS_EXCP
> with
> (nolock) WHERE ACCOUNTID=@.ACCOUNTID
> AND PROVIDER_ID=@.PROVIDER_ID AND EMPID=@.TR
> if @.TRANS_VOICE_WEIGHT is not null
> SET @.WEIGHTED_TR_DURATION = @.TRANS_VOICE_WEIGHT * @.DURATION
> --SELECT @.DICTATOR=FIRST_NAME + ' ' + LAST_NAME FROM PROVIDER WHERE
> PROVIDER_ID=@.PROVIDER_ID
> SELECT @.DICTATOR=DICTATED_BY FROM PROVIDER with (nolock) WHERE
> PROVIDER_ID=@.PROVIDER_ID
> SELECT @.FILE_ASSIGNED_DATE = dbo. sfd_fn_File_Assigned_Date(@.TR,getdate())
> SET @.FILE_ASSIGNED_DATE = CONVERT(VARCHAR(12),@.FILE_ASSIGNED_DATE,
101)
> BEGIN transaction
> Insert into
> dbo. Distribution(VOICE_FILE_LOCATION,VOICE_F
ILE_NAME,ASSIGNED_TO_TR,TR_SHI
FT_ID,NOTES,
> TR_ASSIGNED_TIME) values
> (@.VOICE_FILE_LOCATION,@.VOICE_FILE_NAME,@.
TR,@.SHIFT_ID
> ,'Distributed to Tr',GETDATE())
> If @.@.error != 0
> BEGIN
> rollback transaction
> RETURN 0
> END
> IF EXISTS(SELECT EMPID from emp_assigned_workload WHERE EMPID=@.TR AND
> FILE_ASSIGNED_DATE=@.FILE_ASSIGNED_DATE
> AND SHIFT_ID=@.SHIFT_ID)
> Update EMP_ASSIGNED_WORKLOAD with (updlock) SET
> WORK_ASSIGNED=WORK_ASSIGNED+@.WEIGHTED_TR
_DURATION,
> TR_WORK_ASSIGNED=TR_WORK_ASSIGNED+@.DURAT
ION WHERE EMPID=@.TR AND
> FILE_ASSIGNED_DATE=@.FILE_ASSIGNED_DATE
> AND SHIFT_ID=@.SHIFT_ID
> ELSE
> INSERT INTO
> EMP_ASSIGNED_WORKLOAD(FILE_ASSIGNED_DATE
,EMPID,PR_WORK_COMPLETED,TR_WORK_C
OMPLETED,
> UNDER_TRANSCRIPTION,READY_FOR_PROOFREADI
NG,PR_WORK_ASSIGNED,TR_WORK_ASSIGN
ED,SHIFT_ID,
> WORK_ASSIGNED) VALUES
> (@.FILE_ASSIGNED_DATE,@.TR,0,0,0,0,0,@.DURA
TION,@.SHIFT_ID,
> @.WEIGHTED_TR_DURATION)
> If @.@.error != 0 OR @.@.ROWCOUNT=0
> BEGIN
> rollback transaction
> RETURN -10
> END
> INSERT INTO
> VOICE_FILE_PRIORITY(VOICE_FILE_LOCATION,
VOICE_FILE_NAME,ACCOUNT_ID,PROVIDE
R_ID,
> PRIORITY,ASSIGNED_TO_TR,ASSIGNED_TO_PR,I
MPORTANCE,STATUS,PENDINGSTATUS)
> VALUES
> (@.VOICE_FILE_LOCATION,@.VOICE_FILE_NAME,@.
ACCOUNTID,@.PROVIDER_ID,
> @.MAX_Priority,@.TR ,NULL,@.STAT_FLAG,'N',NULL)
> If @.@.error != 0
> BEGIN
> rollback transaction
> RETURN 0
> END
> -- written by raghu for deadlock
> select @.MASTER_BLOCKED = blocked from dbo.master.sysprocesses with
> (nolock)
> where blocked<>0
> if @.MASTER_BLOCKED=0
> begin
> UPDATE VOICE_FILES with (updlock) SET STATUS='T',TYPE= CASE WHEN TYPE='B'
> OR TYPE='R' THEN 'N' ELSE TYPE END,UPDATE_TIME=getdate()
> WHERE VOICE_FILE_LOCATION=@.VOICE_FILE_LOCATION
AND
> VOICE_FILE_NAME=@.VOICE_FILE_NAME
> If @.@.error <> 0 or @.@.rowcount=0
> BEGIN
> rollback transaction
> RETURN 0
> END
> end
> else
> begin
> SET LOCK_TIMEOUT 30
> if @.@.LOCK_TIMEOUT= 30
> rollback transaction
> RETURN 0
> end
> -- end by raghu
>
>
> COMMIT TRANSACTION
> RETURN 1
> GO
>
> --end sp

Saturday, February 25, 2012

Please help: insert into table in cursor-loop?

Hi, all,

I'd like to insert returned items into the result table @.r:

Create function get_items

returns @.r table(a1 varchar(30),a2 varchar(30),a3 varchar(30),a4 varchar(30),a5 varchar(30))

as

begin

declare @.v_item nvarchar (30);

declare @.v_count int;

declare cur_items cursor for

select top 5 a.item from itemtable a; -- gets max. 5 items!

open cur_items;

fetch next from cur_items into @.v_item;

set @.v_count = 0;

while (@.@.fetch_status = 0)

begin

set @.v_count = @.v_count+1;

-- Problem:

-- Insert into @.r(a1,a2...) values(@.v_item)... ?

--

fetch next from cur_items into @.v_item;

end;

close cur_items;

DEALLOCATE cur_items;

return

END

=========

That means,

if @.v_count = 1,

@.r has only one item, such as: 'item1', <null>, <null>, <null>, <null>

but if @.v_count = 5,

@.r has full-row, such as: 'item1', 'item2', 'item3', 'item4', 'item5'

Thank you very much in advance!

If I understand your problem correctly, you don't need a cursor. Use a table valued function (TVF).

Something like this:

CREATE FUNCTION Get_Items ()
RETURNS table
AS
RETURN
( SELECT TOP 5 Item
FROM ItemTable
)

GO

|||

Hello, Arnie Rowland, thanks for your answer!

In my code I have to use the cursor, the definition of the cursor above is just example,

and the result from the cursor is: 'item1', 'item2'... or more, but max. 5 items.

Best regards

|||

Hi, all,

maybe I have to convert all rows of the result table to one row?

after execute the function I got e.g. 3 rows:

item1

item2

item3

==>

if I can convert them to one row, then I have:

item1 | item2 | item3 | <null> | <null>

How can I get it?

Best regards

|||

Here are some resources that may help you get your desired output.

I highly recommend NOT using a cursor if at all possible -and in almost all data retrieval situations, it is possible!

Lists -Field Concatenation
http://groups.google.com/group/microsoft.public.sqlserver.programming/msg/2d85bf366dd9e73e
http://milambda.blogspot.com/2005/07/return-related-values-as-array.html

Lists -Field Concatenation( For SQL 2000 & 2005 )
http://groups.google.com/group/microsoft.public.sqlserver.programming/msg/7e5b4c8a9b9b968a

Lists -Field Concatenation, One Field to Itself for string
SQL 2000
http://omnibuzz-sql.blogspot.com/2006/06/concatenate-values-in-column-in-sql.html
SQL 2005 http://sqlblogcasts.com/blogs/tonyrogerson/archive/2006/07/06/871.aspx
http://www.projectdmx.com/tsql/rowconcatenate.aspx

Lists -Recursive Queries
http://www.paragoncorporation.com/ArticleDetail.aspx?ArticleID=9
http://www.yafla.com/papers/sqlhierarchies/sqlhierarchies.htm
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnsqlpro03/html/sp03i8.asp
http://www.wwwcoder.com/main/parentid/191/site/1857/68/default.aspx
http://www.sqlservercentral.com/columnists/fBROUARD/recursivequeriesinsql1999andsqlserver2005.asp