Архив метки: MsSql

Переменные для имени колонки ms sql

MsSql_Declare Переменные в ms sqlНеобходимо заменить название имени столбца на значение из переменной.  То есть брать название столбца из переменной. В Ms SQL  это можно сделать достаточно просто через  exec().

Итак стандартный запрос

SELECT '001' AS [CODLIS]
, DATAVAL
, stuff(tbl.COD, 10, 2, 'DL') AS CODART
, tbl.DL AS PR
FROM
tbl
WHERE
tbl.DL > 0

Как видно текст DL встречается аж в 3 местах. Вот его нам надо заменить на свою переменную, чтобы меняя только значение переменной менять и имя колонки и текст в функции stuff.

Делается это так.

Создаём 2 переменные. В одной будет имя колонки, в другой сам запрос.

DECLARE @str varchar(3000),@nameCol varchar(2); 

Устанавливаем значения. Не забываем про двойной апостроф

Set  @nameCol = 'DL'

Set @str = 'SELECT ''001'' AS [CODLIS]
     , ''03.28.2015 0:00:00'' AS DATAVAL
     , stuff(tbl.COD, 10, 2, '''+@nameCol+''') AS CODART
     , '+@nameCol+' AS PR
FROM
 tbl
WHERE
 '+@nameCol+' > 0'

Теперь запускаем наш запрос используя exec()

exec(@str)

Вот собственно и все, меняя значение переменной @nameCol меняем и сам запрос и имена столбцов.

Ошибка SQL Server blocked access to STATEMENT

SQL Запрос на изменение данных UPDATEЕсли при попытке загрузить из внешнего файла возникают такие ошибки:

SQL Server blocked access to STATEMENT ‘OpenRowset/OpenDatasource’ of component ‘Ad Hoc Distributed Queries’ because this component is turned off as part of the security configuration for this server. A system administrator can enable the use of ‘Ad Hoc Distributed Queries’ by using sp_configure. For more information about enabling ‘Ad Hoc Distributed Queries’, see «Surface Area Configuration» in SQL Server Books Online. SQL.sql 1 1

OLE DB provider ‘Microsoft.Jet.OLEDB.4.0’ cannot be used for distributed queries because the provider is configured to run in single-threaded apartment mode. SQL.sql 7 19

Cannot create an instance of OLE DB provider «MSDASC» for linked server «(null)». SQL.sql 1 1

Значит не настроен MSSQL.

Необходимо выполнить следующие строки:

EXEC sp_configure 'show advanced options', 1
RECONFIGURE
GO
EXEC sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO
USE [master]
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'AllowInProcess', 1
GO
EXEC master.dbo.sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0', N'DynamicParameters', 1
GO

После успешного выполнения этих строк все должно работать нормально.

Очистка больших файлов логов ldf в MsSQL

mssql_expressПроблема:

Слишком большой файл логов транзакций, например srvcalog.ldf — почти 30 ГБ. Его надо очистить, уменьшить размер.

Решение

Решением является штатная процедура чистки логов — в MS SQL Server Management Studio Express создаем новый запрос к требуемой базе. И там прописать следующий код скрипта

BACKUP LOG [имя вашей базы] WITH TRUNCATE_ONLY
DBCC SHRINKFILE(2, TRUNCATEONLY)

выполняем.

В моем случае файл логов занимал 30ГБ, после выполнения запроса 1Мб.