Tag Archive sql server

Byphunsanit

SQL Server: Kill process ของข้าให้หมด

มีแก้งานที่เขียน query ได้โหดยูเครนมาก (รัสเซียได้พิสูจน์ให้เห็นแล้วว่ากาก) ใช้ cpu สูงมาก ใช้ ram เกือบหมดเม็ค แล้วมีคนใช้งานอยู่พร้อม ๆ กัน T-T เลยหา script มาจัดการดีด connection ที่ใช้อยู่ในเครื่องตัวเองทิ้งยกเว้นที่ใช้อยู่ใน sql server management studio (ssms) และโปรแกรม app ที่กำลังเขียนอยู่

DECLARE @SqlCmd VARCHAR(1000)
  
	,@HostName VARCHAR(100)-- Set the hostname name from which to kill the connections

  
	--SET @HostName = 'Pitt_P'

SET @HostName = HOST_NAME()

SET @SqlCmd = ''  SELECT @Sqlcmd = @SqlCmd + CHAR(13) + CHAR(10) + 'KILL ' + convert(CHAR(10), spid) + ' '
 
FROM master.dbo.sysprocesses
 
WHERE hostname = @HostName
 
	AND DBID <> 0
 
	AND spid <> @@spid PRINT @sqlcmd EXEC(@Sqlcmd)
 
GO

แก้จากต้นแบบ Kill all processes associated with a hostname โดยดึงข้อมูล HOST HOST_NAME แทนที่จะใส่ชื่อเครื่องตัวเองไป

Byphunsanit

​ Cannot resolve the collation conflict between​ "Thai_CI_AS" and "Thai_CI_AI"

ดึงข้อมูลจากหลาย database เจอ error

​[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Cannot resolve the collation conflict between “Thai_CI_AS” and “Thai_CI_AI” in the UNION operation.

สาเหตุคือทั้ง 4 database มี table ชื่อเดียวกัน โครงสร้างเหมือนกัน แต่ collation ใช้ ต่างกัน แถมตรวจดูตารางอื่นๆ ก็ใช้กระจัดกระจาย Thai_CI_AI บ้าง Thai_CI_AS บ้าง ดีที่เจอ query ที่แก้ให้ได้ง่ายๆ เอามาดัดแปลงอักนิดให้เรียงตามชื่อตารางก็ใช้ง่ายเลย

DECLARE @collate SYSNAME
SELECT @collate = 'Thai_CI_AS'
SELECT
      '[' + SCHEMA_NAME(o.[schema_id]) + '].[' + o.name + '] -> ' + c.name AS a
    , 'ALTER TABLE [' + SCHEMA_NAME(o.[schema_id]) + '].[' + o.name + ']
        ALTER COLUMN [' + c.name + '] ' +
        UPPER(t.name) +
        CASE WHEN t.name NOT IN ('ntext', 'text')
            THEN '(' +
                CASE
                    WHEN t.name IN ('nchar', 'nvarchar') AND c.max_length != -1
                        THEN CAST(c.max_length / 2 AS VARCHAR(10))
                    WHEN t.name IN ('nchar', 'nvarchar') AND c.max_length = -1
                        THEN 'MAX'
                    ELSE CAST(c.max_length AS VARCHAR(10))
                END + ')'
            ELSE ''
        END + ' COLLATE ' + @collate +
        CASE WHEN c.is_nullable = 1
            THEN ' NULL'
            ELSE ' NOT NULL'
        END
FROM sys.columns c WITH(NOLOCK)
JOIN sys.objects o WITH(NOLOCK) ON c.[object_id] = o.[object_id]
JOIN sys.types t WITH(NOLOCK) ON c.system_type_id = t.system_type_id AND c.user_type_id = t.user_type_id
WHERE t.name IN ('char', 'varchar', 'text', 'nvarchar', 'ntext', 'nchar')
    AND c.collation_name != @collate
    AND o.[type] = 'U'
ORDER BY a

เอาผลลัพธ์ ใน column ที่ 2 ไป execute อีกครั้งก็ใช้ได้

ขอบคุณ Cr: Devart สำหรับคำตอบใน how to change the collate to all the columns of the database?