特定のクエリを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]
'.
手がかりは素晴らしいでしょう。私はしばらくの間グーグルを見回しました、そしてこれを何を変えるべきか/どのように修正するべきか理解することができません。それが言うように引用符を削除または閉じると、物事が壊れます。ありがとう。