I have select
x
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())'
Im droping getdate defaults and want bind one getdate default. Result of this has 2 lines
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'
and i want to execute it in one command. Any ideas?
Advertisement
Answer
You won’t be able to dynamically generate the SQL and execute it in a single set based query. You’ll have to iterate through the results of your select – either in a CURSOR or WHILE loop – and build the generated statement into a variable and then execute that with EXEC or sp_executesql; e.g.
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 '+@TableName+N' drop '+@ConstraintName+N';'
EXEC sys.sp_executesql @stmt = @sql;
SET @sql = N' sp_bindefault ''abc'' ,'''+@TableName+'.'+@ColumnName+N''';'
EXEC sys.sp_executesql @stmt = @sql;
FETCH NEXT FROM getdateDefaults INTO @TableName, @ConstraintName, @ColumnName;
END
CLOSE getdateDefaults;
DEALLOCATE getdateDefaults;