Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 dynmic sql  [new]
Itex2017
Member

Откуда:
Сообщений: 16
привет ребята
ето дает меня ошибка

declare @sql varchar(1000),@col varchar(20)='Name',@TableName varchar(100)='customers'
select @sql='insert into ' + @TableName + '('+@col+')'+'values(' + rtrim(cast(@col as nchar(20))) + ')'
exec  (@sql)

Msg 207, Level 16, State 1, Line 27
Invalid column name 'Name'.


но в таблице ест такой столбец
30 дек 17, 00:36    [21073938]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
Вы пробовали смотреть, что получилось в переменной @sql? Ну, просто чтобы хотя бы поржать, я не знаю.
30 дек 17, 00:42    [21073953]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
Itex2017
Member

Откуда:
Сообщений: 16
Гавриленко Сергей Алексеевич,

дает меня ето
print @sql

insert into customers(Name)values(Name)


ето част stored proc ктотрый я хочу сделат круд в динамически

селект уже работает

я хотел бы добавит инсерт апдейт тоже
но уже я в еррор

прочедура ето )



create Procedure [dbo].[crud_operation]
	@TableName VarChar(100),
	@id int=null,
	@action int,@COL1 NVARCHAR(20)=null,@COL2 NVARCHAR(20)=null,@cval1 nvarchar(20)=null,@cval2 nvarchar(20)=null
AS

Declare @SQL VarChar(1000)
----simple select--
 
SELECT @SQL = case
 when (@action = 0 and @id is null) then  'SELECT * FROM ' + @TableName
 when (@action=0 and  @id is not null) then 'SELECT * FROM ' + @TableName +' '+ N'where id=' + rtrim(cast (@id as nchar(2)))
 else '' end 
print @sql
Exec ( @SQL)

exec dbo.crud_operation @TableName='customers',@action=0,@id=2

2	hbhb	mn nmnm
30 дек 17, 01:10    [21074021]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
Itex2017
insert into customers(Name)values(Name)
И откуда, по-вашему, сервер должен взять значение Name, которое вы нарисовали в values?
30 дек 17, 01:32    [21074062]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
Itex2017
Member

Откуда:
Сообщений: 16
Гавриленко Сергей Алексеевич,

спасибо вам Сергей Алексеевич за внимание и дискуссии

я сам записал ето

етот вариант работает

alter Procedure [dbo].[crud_operation]
	@TableName VarChar(100),
	@id int=null,
	@action int,@COL1 NVARCHAR(20)=null,@COL2 NVARCHAR(20)=null,@cval1 nvarchar(20)=null,@cval2 nvarchar(20)=null
AS

Declare @SQL VarChar(1000)
----simple select--
 
SELECT @SQL = case
 when (@action = 0 and @id is null) then  'SELECT * FROM ' + @TableName
 when (@action=0 and  @id is not null) then 'SELECT * FROM ' + @TableName +' '+ N'where id=' + rtrim(cast (@id as nchar(2)))
 when (@action=1 and @COL1 is not null and @COL2 is null) then 'insert into ' + @TableName + ' ' +'('+@COL1+')' + ' ' + 'select '+ ''''+@cval1+''''
 when (@action=1 and @COL1 is not null and @COL2 is not null) then
 'insert into ' + @TableName + '('+@COL1+','+@COL2 + ')' + ' ' + 'select '+ ''''+@cval1+'''' +','+''''+@cval2+''''
 else '' end 
print @sql
Exec ( @SQL)


insert into customers(Name,Country) select 'x','az'

(1 row(s) affected)



но у меня ест еше вопрос
если етот столбец не бедет варчар например датетайм или интейджер

тогда мне нужн в прочедуре записат коллекции @col1,@col2 и тг

что то может получит етот автоматически

спасибо
30 дек 17, 01:38    [21074071]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
Itex2017
но у меня ест еше вопрос
если етот столбец не бедет варчар например датетайм или интейджер

тогда мне нужн в прочедуре записат коллекции @col1,@col2 и тг
А это вы вопрос вашему архитектору задайте, который вот эту адскую хрень придумал.
30 дек 17, 01:58    [21074087]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
Itex2017
Member

Откуда:
Сообщений: 16
Гавриленко Сергей Алексеевич,

да ето я получаю

SELECT DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
     TABLE_NAME = 'customers' AND 
     COLUMN_NAME = 'Name'

DATA_TYPE
nvarchar


ето дает меня просто nvarchar

могу я динамически в етом процедуре изменит тик переменные в инсерте и апдейте?
30 дек 17, 02:06    [21074092]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36696
Не можете.
30 дек 17, 02:12    [21074099]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Itex2017,
Вот здесь концептуальная ошибка
	@TableName VarChar(100),
	@id int=null,
	@action int,@COL1 NVARCHAR(20)=null,@COL2 NVARCHAR(20)=null,@cval1 nvarchar(20)=null,@cval2 nvarchar(20)=null
AS

Declare @SQL VarChar(1000)
----simple select--

А вот здесь кошерный код
	@TableName NVARCHAR(MAX),
	@id int=null,
	@action int,@COL1 NVARCHAR(MAX)=null,@COL2 NVARCHAR(MAX)=null,@cval1 nNVARCHAR(MAX)=null,@cval2 NVARCHAR(MAX)=null
AS

Declare @SQL NVARCHAR(MAX)
----simple select--
30 дек 17, 11:39    [21074338]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Andy_OLAP,

В третьей строке сверху заменить nNVARCHAR(MAX) на NVARCHAR(MAX).
30 дек 17, 11:40    [21074342]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
256k
Member

Откуда: с.Торчилово, Псковская обл.
Сообщений: 437
Andy_OLAP
Andy_OLAP,

В третьей строке сверху заменить nNVARCHAR(MAX) на NVARCHAR(MAX).


а может и не надо, это же "кошерный код"
30 дек 17, 11:51    [21074355]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
Andy_OLAP
А вот здесь кошерный код

Если уж кошерный, то так )
	@action int,@COL1 sysname=null,@COL2 sysname=null,@cval1 NVARCHAR(MAX)=null,@cval2 NVARCHAR(MAX)=null
30 дек 17, 12:29    [21074423]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
ptr128,

Коллега, я думаю, что Ваше руководство не переживает ни за единый шекель, потраченный на Вашу зарплату или премию. Таки здорово, что есть люди, способные улучшить любой выложенный код.
30 дек 17, 12:39    [21074434]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
Andy_OLAP
ptr128,

Коллега, я думаю, что Ваше руководство не переживает ни за единый шекель, потраченный на Вашу зарплату или премию. Таки здорово, что есть люди, способные улучшить любой выложенный код.


Коллега, скобка после фразы обозначает смайлик. Я просто пошутил.
Если чем-то Вас обидел при этом - приношу извинения.
30 дек 17, 13:53    [21074529]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
ptr128,

Ой-вей, я смайлик не ставил, но в сообщении выбрал желтенький значок улыбки. Вы пошутили, я пошутил, уважаю людей с хорошим чувством юмора и Вас к ним причисляю.
Таки с наступающим, коллега! :)
30 дек 17, 14:03    [21074555]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
ptr128
Member

Откуда: Moscow
Сообщений: 398
Andy_OLAP
в сообщении выбрал желтенький значок улыбки

Совсем слепой стал (
Andy_OLAP
Таки с наступающим, коллега! :)

И Вас с наступающим, коллега!
30 дек 17, 14:22    [21074588]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
Itex2017
Member

Откуда:
Сообщений: 16
спасибо всем ребята за вниманию за дискуссии


финадная форма етот прочедур так но как может опдейт интейджер с нварчар
я незнаю но он сделает
ето ненормално я думаю

ALTER Procedure [dbo].[crud_operation]
	@TableName VarChar(100),
	@id int=null,
	@action int,@COL1 NVARCHAR(20)=null,@COL2 NVARCHAR(20)=null,@cval1 nvarchar(20)=null,@cval2 nvarchar(20)=null
AS

Declare @SQL VarChar(1000)
----simple select--
 
SELECT @SQL = case
 when (@action = 0 and @id is null) then  'SELECT * FROM ' + @TableName
 when (@action=0 and  @id is not null) then 'SELECT * FROM ' + @TableName +' '+ N'where id=' + rtrim(cast (@id as int))
----insert----
 when (@action=1 and @COL1 is not null and @COL2 is null) then 'insert into ' + @TableName + ' ' +'('+@COL1+')' + ' ' + 'select '+ ''''+@cval1+''''
 when (@action=1 and @COL1 is not null and @COL2 is not null) then
 'insert into ' + @TableName + '('+@COL1+','+@COL2 + ')' + ' ' + 'select '+ ''''+@cval1+'''' +','+''''+@cval2+''''
----delete----
   when(@action=2 and @id is not null) then
 'delete from ' + @TableName + ' ' + N'where id='+ rtrim(cast(@id as int))
----update ---
when (@action=3 and @id is not null and (@COL1 is not null and @COL2 is null))
   then 'update ' + @TableName + ' set ' +  @COL1 + '=' + @cval1 +' where id=' + rtrim(cast(@id as int)) 

else '' end
print @sql
Exec ( @SQL)



exec crud_operation @TableName='emin',@action=3,@id=1,@COL1='phone',@cval1='5'

exec crud_operation @TableName='emin',@action=3,@id=1,@COL1='phone',@cval1=5

update emin set phone=5 where id=1

(1 row(s) affected)
update emin set phone=5 where id=1

(1 row(s) affected)



ето как может работат в здес phone интейджер столбец
30 дек 17, 16:05    [21074761]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
Itex2017
Member

Откуда:
Сообщений: 16
И еше здес ест
[SRC PLSQL]
@COL1 NVARCHAR(20)=null,@COL2 NVARCHAR(20)=null,

и

@cval1 nvarchar(20)=null,@cval2 nvarchar(20)=null
[/SRC]

етот стобцы в любом табличе

процедур смотрит какие не нулл и очен сложно
например так

when (@action=1 and @COL1 is not null and @COL2 is not null)

then
 'insert into ' + @TableName + '('+@COL1+','+@COL2 + ')' + ' ' + 'select '+ ''''+@cval1+'''' +','+''''+@cval2+''''



я испозую @cval1 @cval2

можно сделат ето автоматически


какие столбцы из нот нулл тогда количества инсерт или апдейд парамет тоже так
30 дек 17, 16:18    [21074774]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
Itex2017
Member

Откуда:
Сообщений: 16
ето я хотел бы получит
спасибо всем друзя
за дискуссии и советы
с праздником!!!!

declare @test table (col1 nvarchar(max),col2 nvarchar(max)) 
declare @sql nvarchar(max),@tablename nvarchar(max)='nasa',@id nvarchar(max)='1',
@parm nvarchar(100)='3'
insert into @test(col1,col2)
values
('col1','00'),('col2','00'),('col3','00')
select * from @test

set @sql= 'update '  + QUOTENAME( @tablename) + NCHAR(10)+'set'+NCHAR(10)+
STUFF( (select ','+quotename(col1) +'='+ '''' + col2 +'''' + nchar(10) from @test for xml path('')),1,1,'')  
  SET @sql = @sql + N'WHERE ID =' + @parm;             
  
print @sql
exec (@sql)
31 дек 17, 15:31    [21076130]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
Andy_OLAP
Member

Откуда: я знаю, что Хапоэль Беэр-Шева - чемпион
Сообщений: 3151
Itex2017,

Hi, friend, where are you from? Jet Propulsion Laboratory, Pasadena?
Listen, you're making the wrong choice. Converting in "nchar(10) from @test" for one part of your dynamic code is a mistake, because you attach "where" after that.
Do always right choise.
@parm nvarchar(100)='3' -- okey, not bad

+ convert(nvarchar(max),nchar(10) from @test for xml path('')),1,1,''))  -- only in nvarchar(max)
  SET @sql = @sql + N'WHERE ID =' + convert(nvarchar(max),@parm); -- only in nvarchar(max)            

Thanks for your congratulations, be happy too!
31 дек 17, 21:59    [21076620]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
iap
Member

Откуда: Москва
Сообщений: 46954
Andy_OLAP
Itex2017,

Hi, friend, where are you from? Jet Propulsion Laboratory, Pasadena?
Listen, you're making the wrong choice. Converting in "nchar(10) from @test" for one part of your dynamic code is a mistake, because you attach "where" after that.
Do always right choise.
@parm nvarchar(100)='3' -- okey, not bad

+ convert(nvarchar(max),nchar(10) from @test for xml path('')),1,1,''))  -- only in nvarchar(max)
  SET @sql = @sql + N'WHERE ID =' + convert(nvarchar(max),@parm); -- only in nvarchar(max)            


Thanks for your congratulations, be happy too!
1, 1, '' - это из STUFF()? А где он сам-то?
1 янв 18, 10:48    [21077091]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
256k
Member

Откуда: с.Торчилово, Псковская обл.
Сообщений: 437
Andy_OLAP
Itex2017,

Hi, friend, where are you from? Jet Propulsion Laboratory, Pasadena?
Listen, you're making the wrong choice. Converting in "nchar(10) from @test" for one part of your dynamic code is a mistake, because you attach "where" after that.
Do always right choise.
@parm nvarchar(100)='3' -- okey, not bad

+ convert(nvarchar(max),nchar(10) from @test for xml path('')),1,1,''))  -- only in nvarchar(max)
  SET @sql = @sql + N'WHERE ID =' + convert(nvarchar(max),@parm); -- only in nvarchar(max)            

Thanks for your congratulations, be happy too!


Hi friend,
Do always right choise too.
1 янв 18, 11:16    [21077111]     Ответить | Цитировать Сообщить модератору
 Re: dynmic sql  [new]
Itex2017
Member

Откуда:
Сообщений: 16
iap
Andy_OLAP
Itex2017,

Hi, friend, where are you from? Jet Propulsion Laboratory, Pasadena?
Listen, you're making the wrong choice. Converting in "nchar(10) from @test" for one part of your dynamic code is a mistake, because you attach "where" after that.
Do always right choise.
@parm nvarchar(100)='3' -- okey, not bad

+ convert(nvarchar(max),nchar(10) from @test for xml path('')),1,1,''))  -- only in nvarchar(max)
  SET @sql = @sql + N'WHERE ID =' + convert(nvarchar(max),@parm); -- only in nvarchar(max)            


Thanks for your congratulations, be happy too!
1, 1, '' - это из STUFF()? А где он сам-то?



set @sql= 'update '  + QUOTENAME( @tablename) + NCHAR(10)+'set'+NCHAR(10)+
STUFF( (select ','+quotename(col1) +'='+ '''' + col2 +'''' + nchar(10) from @test for xml path('')),1,1,'')  
  SET @sql = @sql + N'WHERE ID =' + @parm; 




вообше прочессс очен длинный
я исполузю перед етим финкция Split string
после етого табле валуед
можно мне поделит вес скрипт сдес за дискуссию
думаю всегда ест оптималный вариант
2 янв 18, 01:35    [21078017]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить