2

特定のクエリをSSMSの外部で機能させるのに問題があります。クエリはすべてのユーザー定義データ型を収集し、IFEXISTSステートメントとCREATETYPEコマンドを作成して、すべてのユーザー定義データ型を簡単に転送できるようにします。そのためのクエリは次のとおりです(私が書いたものではありませんが、https://stackoverflow.com/a/12761027/865893にあります)

SET NOCOUNT ON

SELECT 'USE ' + QUOTENAME(DB_NAME(), '[') + '
GO';

SELECT '
IF  EXISTS (SELECT * FROM sys.types st JOIN sys.schemas ss ON st.schema_id = ss.schema_id WHERE st.name = N''' + st.[name] + ''' AND ss.name = N''' + ss.[name] + ''')
    DROP TYPE ' + QUOTENAME(ss.name, '[') + '.' + QUOTENAME(st.name, '[') + '
GO

CREATE TYPE ' + QUOTENAME(ss.name, '[') + '.' + QUOTENAME(st.name, '[') + ' FROM ' + 
QUOTENAME(bs.[name], '[') + 
    CASE bs.[name]
        WHEN 'char' THEN (CASE ISNULL(st.max_length, 0) WHEN 0 THEN '' WHEN -1 THEN '(MAX)' ELSE '(' + convert(varchar(10), st.max_length) + ')' END)
        WHEN 'nchar' THEN (CASE ISNULL(st.max_length, 0) WHEN 0 THEN '' WHEN -1 THEN '(MAX)' ELSE '(' + convert(varchar(10), st.max_length/2) + ')' END)
        WHEN 'varchar' THEN (CASE ISNULL(st.max_length, 0) WHEN 0 THEN '' WHEN -1 THEN '(MAX)' ELSE '(' + convert(varchar(10), st.max_length) + ')' END)
        WHEN 'nvarchar' THEN (CASE ISNULL(st.max_length, 0) WHEN 0 THEN '' WHEN -1 THEN '(MAX)' ELSE '(' + convert(varchar(10), st.max_length/2) + ')' END)
        WHEN 'numeric' THEN (CASE ISNULL(st.[precision], 0) WHEN 0 THEN '' ELSE '(' + convert(varchar(10), st.[precision]) + ', ' + convert(varchar(10), st.[scale]) + ')' END)
        WHEN 'decimal' THEN (CASE ISNULL(st.[precision], 0) WHEN 0 THEN '' ELSE '(' + convert(varchar(10), st.[precision]) + ', ' + convert(varchar(10), st.[scale]) + ')' END)
        WHEN 'varbinary' THEN (CASE st.max_length WHEN -1 THEN '(max)' ELSE '(' + convert(varchar(10), st.max_length) + ')' END)
        ELSE ''
    END + 
'
GO
'
FROM sys.types st 
    INNER JOIN sys.schemas ss ON st.[schema_id] = ss.[schema_id]
    INNER JOIN sys.types bs ON bs.[user_type_id] = st.[system_type_id]
WHERE st.[is_user_defined] = 1 -- exclude system types
ORDER BY st.[name], ss.[name]

これはSSMS内の魅力のように機能しますが、毎回SSMS内に入り、これを自分でファイルにエクスポートする必要はありません。次のようにバッチファイルでosqlコマンドを使用してクエリを実行すると。

@echo off
cls

set /p SName=Server Name :
set /p UName=User Name :
set /p Pwd=Password :
set /p DbName=Database Name :

set /p choice=ARE YOU SURE TO EXECUTE SCRIPTS in %DbName% (y/n) ?

if '%choice%'=='y' goto begin
goto end

:begin
if exist _Deploy.txt del _Deploy.txt

@echo on

DEL addUserDefinedTypes.txt
osql -n -S %SName% -d master -U %UName% -i "getTypesSelectQuery.sql" -o addUserDefinedTypes.txt -P %Pwd%

@notepad addUserDefinedTypes.txt

:end

ただし、これにより次の出力が得られます。

Msg 105, Level 15, State 1, Server US1524NB, Line 8
Unclosed quotation mark after the character string '
'.
Msg 102, Level 15, State 1, Server US1524NB, Line 8
Incorrect syntax near '
'.
Msg 102, Level 15, State 1, Server US1524NB, Line 2
Incorrect syntax near ' + QUOTENAME(ss.name, '.
Msg 105, Level 15, State 1, Server US1524NB, Line 14
Unclosed quotation mark after the character string '
'.
Msg 105, Level 15, State 1, Server US1524NB, Line 1
Unclosed quotation mark after the character string '
FROM sys.types st 
INNER JOIN sys.schemas ss ON st.[schema_id] = ss.[schema_id]
INNER JOIN sys.types bs ON bs.[user_type_id] = st.[system_type_id]
WHERE st.[is_user_defined] = 1 -- exclude system types
ORDER BY st.[name], ss.[name]
'.

手がかりは素晴らしいでしょう。私はしばらくの間グーグルを見回しました、そしてこれを何を変えるべきか/どのように修正するべきか理解することができません。それが言うように引用符を削除または閉じると、物事が壊れます。ありがとう。

4

1 に答える 1

1

使用している SQL Server のバージョンは何ですか?

SQL Server 2005では、コマンド ラインから SQL スクリプトを実行するための推奨される方法はSQLCMDosql.

使用可能なコマンド ライン スイッチの詳細については、MSDN SQL Server Books Online のトピックを参照してください。SQLCMD

于 2013-01-10T21:29:57.693 に答える