Author Archives: Jugal Shah

Unknown's avatar

About Jugal Shah

Jugal Shah has 19 plus years of experience in leading and managing the data and analytics practices. He has done the significant work in databases, analytics and generative AI projects. You can check his profile on http://sqldbpool.com/certificationawards/ URL.

Insert Extended Character using OSQL Utility

Problem: OSQL utility uses ODBC to communicate with the server. User’s problem is that the ODBC driver he is using to connect to the database is performing translations on the character data in the T-SQL script. Extended characters, which are not in the standard ASCII character set, are translated by the driver based on drive settings. The character translation option is ON by default when SQL Server executes scripts through the OSQL utility. 

Below query is inserting garbage data in the table. 

CREATE TABLE #temp(col1 varchar(40) NOT NULL )

INSERT INTO #temp VALUES( ‘Tëst’ )

SELECT col1 FROM #temp

DROP TABLE #temp 

Solution: By using Unicode script files and converting the column to Unicode, user can avoid the character translation. For that user needs to add N against the column, which is already added. 

Save As below script file as UNICODE file 

CREATE TABLE #temp(col1 varchar(40) NOT NULL )

INSERT INTO #temp VALUES( ‘Tëst’ )

SELECT col1 FROM #temp

DROP TABLE #temp 

User needs to do the following with the ODBC DSN to execute the scripts successfully, without any translation:

1.    Create an ODBC system data source called MyDSN on the machine where he is executing OSQL with the “Perform translation for character data” option cleared

2.    Specify this data source name as a parameter to OSQL so that OSQL can read the DSN settings and use them upon connection to SQL Server. 

osql -S. -itest.sql –DMyDSN

OR

User needs to develop a script which can pass the ASCII value 

Select ASCII(‘ë’)

INSERT INTO #temp (Col1) Select ‘T’ + chr(233) +  ‘st’

Msg 15410, Level 11, State 1

Error:
Msg 15410, Level 11, State 1, Server Server\INST2, Procedure
sp_addrolemember, Line 75
User or role ‘mydomain\JShah’ does not exist in this database.

Cause
Login already has an account under a different user name on particular database. For example mydomain\JShah user is mapped to database as user name jshah

Solution
ALTER USER [jshah] WITH NAME=[mydomain\jshah]
execute sp_AddRoleMember ‘DBRole’,’mydomain\jshah’

OR
We can pass the actual user name
execute sp_AddRoleMember ‘DBRole’,’jshah’

Msg 15063, Level 16, State 1

Error:
Msg 15063, Level 16, State 1, Server DBServerName, Line 1
The login already has an account under a different user name.

Cause
Login already has an account under a different user name on particular database.

User is executing sp_GrantDBAccess.  sp_GrantDBAccess system stored procedure adds a security account in the current database for a Microsoft SQL Server login or Microsoft Windows NT user or group, and enables it to be granted permissions to perform activities in the database.
But the login already has an account under a different user name on current database. That’s why the it is throwing an error.
 
Solution
Instead of using sp_GrantDBAccess user has to execute below query
ALTER AUTHORIZATION ON SCHEMA::[db_accessadmin] TO [GMO\service-ueagle]

Troubleshoot Blocking

 Troubleshooting Blocking 

What is blocking? Blocking occurs when one connection to SQL Server locks one or more records, and a second connection to SQL Server requires a conflicting lock type on the record or records locked by the first connection. This causes the second connection to wait until the first connection releases its locks. By default, a connection will wait an unlimited amount of time for the blocking lock to go away. Blocking is not the same thing as a deadlock. 

How to avoid blocking

  1. Keep transaction as short as possible
  2. Use locking hints
  3. Follow best practices for Database Maintenance regularly
  4. Improve Query performance so it executes in seconds

Note:

By default, blocking locks do not time out.You can set blocking timeout using below SET statement.

SET LOCK_TIMEOUT timeoutPeriod

 How to find blocking

  1. SP_WHO2 and find the blkby column from output for blocking details
  2. Use SP_Lock to find out lock acquired by blocking query
  3. Select * from sysprocesses where blocked <>0
  4. You can get the blocking SQL Statement using DBCC INPUTBUFFER(SPID)
  5. SP_WHO2 SPID

kernel udopen: operating system error 2 in SQL Server 6.5

 

 

One of my blog reader encountered below error, I have given him the below solution which has resolved this issue.

Error: (SQL Server 6.5)

2009/07/15 19:42:26.89 spid1    Activating disk ‘ITEMPRICE_DATA1’

2009/07/15 19:42:26.89 kernel   udopen: operating system error 2(The system cannot find the file specified.) during the creation/opening of physical device F:\DATA\ITEMPRICE_DATA1.DAT

2009/07/15 19:42:26.89 kernel   udactivate (primary): failed to open device F:\DATA\ITEMPRICE_DATA1.DAT for vdn 42

2009/07/15 19:42:26.89 spid1    Activating disk ‘ITEMPRICE_DATA2’

2009/07/15 19:42:26.89 kernel   udopen: operating system error 2(The system cannot find the file specified.) during the creation/opening of physical device F:\DATA\ITEMPRICE_DATA2.DAT

2009/07/15 19:42:26.89 kernel   udactivate (primary): failed to open device F:\DATA\ITEMPRICE_DATA2.DAT for vdn 43

Solution

1) Rebuilding System Databases by running setup again from the SQL Server Install CD and do a rebuild master.

2) If it’s a 6.5 box, you can go to the console and view the sa password in the registry. run regedit from the console:
HKEY_CURRENT_USER
Software
Microsoft
MSSQLServer
SQLEW
Registered
SQL 6.5
ServerName

3) Check for the directory whether F:\ has Data directory or not

4) Check if the drive was corrupted

4) Check the SQL Server Service running on which account, check the permission of that account

5) http://support.microsoft.com/kb/180500

6) http://support.microsoft.com/kb/236989

7) Go through BOL on SQL Server 6.5 startup parameters

8) Try to login using command prompt and execute Sp_Resetstatus, DBCC CheckDB etc

sqlservr -c -f -T3608 -T4022

9) Check all the databases status from sysdatabases