2017-09-22 8 views
0

を管理者(またはそれがあれば誰でも)が私の前のトピックでさらに質問してもらえないようにしました。SQL実行の戻り値

私は

select 'alter table '+so.name+ 
' drop '+sdc.name+' go sp_bindefault ''abc'' ,'''+so.name+'.'+sc.name+'''' 
from sys.objects as so 
     join sys.columns as sc on so.object_id=sc.object_id 
     join sys.default_constraints as sdc on sc.object_id=sdc.parent_object_id 
                 and sc.column_id=sdc.parent_column_id 
where so.type='U' 
     and so.name like 'z%' 
     and sdc.definition='(getdate())' 

イムGETDATEデフォルトをdropingと1つのgetdateデフォルトをバインドしたいを選択しています。この結果は2行です

alter table zamestnanci drop DF__zamestnan__datum__2E1BDC42 go sp_bindefault 'abc' ,'zamestnanci.datum_pridania' 
alter table zamestnanci2 drop DF__zamestnan__datum__2F10007B go sp_bindefault 'abc' ,'zamestnanci2.datum_pridania' 

と私は1つのコマンド(私はすべてを行うスクリプトを求められました)を実行したいです。 誰かが私を助けることができますか?おかげ

答えて

2

(テストされていないが、私はあなたのスキーマを持っていないとして)これを試してみてください。 CURSORまたはWHILEループでselectの結果を繰り返し処理し、生成された文を変数に組み込み、EXECまたはsp_executesqlで変数を実行する必要があります。例えば

DECLARE @TableName sysname, 
     @ConstraintName sysname, 
     @ColumnName sysname, 
     @sql nvarchar(4000); 

DECLARE getdateDefaults CURSOR FAST_FORWARD AS 
     SELECT so.name AS TableName, 
       sdc.name AS ConstraintName, 
       sc.name AS ColumnName 
     from sys.objects as so 
       join sys.columns as sc on so.object_id=sc.object_id 
       join sys.default_constraints as sdc on sc.object_id=sdc.parent_object_id 
                   and sc.column_id=sdc.parent_column_id 
     where so.type='U' 
       and so.name like 'z%' 
       and sdc.definition='(getdate())'; 

OPEN getdateDefaults; 
FETCH NEXT FROM getdateDefaults INTO @TableName, @ConstraintName, @ColumnName; 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sql = N'alter table '[email protected]+N' drop '[email protected]+N';' 
    EXEC sys.sp_executesql @stmt = @sql; 
    SET @sql = N' sp_bindefault ''abc'' ,'''[email protected]+'.'[email protected]+N''';' 
    EXEC sys.sp_executesql @stmt = @sql; 

    FETCH NEXT FROM getdateDefaults INTO @TableName, @ConstraintName, @ColumnName; 
END 
CLOSE getdateDefaults; 
DEALLOCATE getdateDefaults; 
+0

これはいいですね、これはいつも書くか、スクリプトを作ることができますか?シェルのように、そのデータベースは彼を覚えていて、私が必要なときにだけ呼び出す。 – efysis

+0

sp_executesqlは有効なTSQL文を実行しますが、カーソルの内容と動的生成を変更する必要がありますが、プリンシパルは同じままです。 – SQLBadPanda

+0

はい、私は理解していると思います。しかし、私はあなたのコメント全体例えば ​​"bindingscript"とし、exec bindingscriptを書くだけです。 – efysis

2

あなたが生成されたクエリを保持する変数を定義する必要があり、それを実行するよりも:

DECLARE @SQL NVARCHAR(MAX) 
SET @SQL = (your_query) 

EXEC sys.sp_executesql @SQL 

あなたはnvarchar型の文字列を作成する必要があり、その代わりに'alter table '使用N'alter table 'の。

+0

サブクエリが複数の値を返しを実行カーソルEにあなたの文字列を取得することができます。サブクエリが=、!=、<, <= , >、> =、またはサブクエリが式として使用されているときは、これは許可されません。 これは、より多くの行を返し、私はパラメータを格納することができないと思います。 – efysis

+0

ああ、まあ、忘れてしまった。あなたはカーソルを持って行かなければなりません。ニックの答えを見てください。 – HoneyBadger

+0

最初の行(データ型の前)から "="を取り除く – PawelCz

0

はあなたが動的SQL を生成し、単一のセットベースのクエリでそれを実行することはできません

DECLARE @tableName  NVARCHAR(255) 
DECLARE @constraintName NVARCHAR(255) 
DECLARE @columnName  NVARCHAR(255) 
DECLARE @sql   NVARCHAR(255) 

SELECT @tableName=so.name, 
     @constraintName=sdc.name, 
     @columnName=sc.name 
FROM sys.objects as so 
      JOIN sys.columns as sc 
       ON so.object_id=sc.object_id 
      JOIN sys.default_constraints as sdc 
       ON sc.object_id=sdc.parent_object_id AND sc.column_id=sdc.parent_column_id 
WHERE so.type='U'AND 
     so.name LIKE 'z%' AND 
     sdc.definition=getdate() 

SET @sql = N'ALTER TABLE ' + @tableName + ' DROP ' + @constraintName + 'go sp_bindefault ''abc'' , ''' + @columnName + '' 
EXEC sp_executesql @sql 
+0

'@sql'はUnicode変数でなければなりません。これは' NVARCHAR'データ型を意味します。 – Sami

+0

私の間違いは、あなたは絶対に正しいです。今編集中です... – SEarle1986

0

あなたは両方の結果

DECLARE RS CURSOR FOR 
    SELECT TOP 5 'SELECT * FROM [' + NAME + ']' 
    FROM sys.Objects 
    WHERE TYPE = 'U' 

DECLARE @TEXT VARCHAR(MAX) 

OPEN RS 
FETCH NEXT FROM RS INTO @TEXT 

WHILE @@FETCH_STATUS = 0 BEGIN 

    FETCH NEXT FROM RS INTO @TEXT 

    EXEC (@TEXT) 

END 

CLOSE RS 
DEALLOCATE RS 
関連する問題